我发现的大多数问题都不是我要找的类型.
我有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:*关系的独特形式是使用其中一个表的外键作为另一个表的主键.
祝好运.