entity-framework – 实体框架两端可选的1对1关系

我发现的大多数问题都不是我要找的类型.

我有2张桌子:

public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }

    public Guid? CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public Customer Customer { get; set; }
}

public class Customer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CustomerId { get; set; }

    public Guid? UserId { get; set; }

    [ForeignKey("UserId")]
    public User User { get; set; }
}

用户可以在不是客户的情况下存在,并且客户可以在不是用户的情况下存在.

我尝试了像这样的流畅API:

modelBuilder.Entity<Customer>()
    .HasOptional<User>(c => c.User)
    .WithOptionalDependent(c => c.Customer)
    .Map(c => c.MapKey("UserId"));

但是当我尝试创建迁移时,它一直给我这个错误:

Customer_User_Source :: Multiplicity在关系’Customer_User’中的角色’Customer_User_Source’中无效.由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“*”.

更新

我改变了我的模型:

public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }

    public virtual Customer Customer { get; set; }
}

public class Customer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CustomerId { get; set; }

    public virtual User User { get; set; }
}

使用流畅的API:

modelBuilder
    .Entity<Customer>()
    .HasOptional(l => l.User)
    .WithOptionalPrincipal()
    .Map(k => k.MapKey("CustomerId"));

modelBuilder
    .Entity<User>()
    .HasOptional(c => c.Customer)
    .WithOptionalPrincipal()
    .Map(k => k.MapKey("UserId"));

这似乎有效但是有没有办法在模型中定义列而不必使用MapKey?

最佳答案 见
link 1

而且link 2也是

这个链接的问题是我不确定它们是否提供了问题的实际解决方案:因为我不知道它是否为两个表中的外键提供唯一性(如此link所示).因为没有EF唯一约束,你必须手动创建它(在生成器中)

最后link解释了执行1:*关系的独特形式是使用其中一个表的外键作为另一个表的主键.

祝好运.

点赞