我的域模型有User和Address类
public User
{
int Id
Address PrimaryAddress
Address SecondaryAddress
and some other Properties
}两者都是可选的,但每个地址都必须有一个用户。Codeirst映射看起来像
modelBuilder.Entity<User>()
.HasOptional(u => u.PrimaryAddress)
.WithRequired()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(u => u.SecondaryAddress)
.WithRequired()
.WillCascadeOnDelete(false);但这并没有产生预期的结果。我希望用户表有两列(int,null)指向地址表。地址表可能具有UserId (外键,整型,非空值)列。但是使用上面的代码,地址的"ID“列充当PK和FK (指向用户表)。
发布于 2011-12-21 21:15:17
您已经映射了一对一的关系,这正是您在数据库中看到的。简而言之,你想要实现的目标不可能通过这种方式实现。
特别是Address必须有一个User的部分无法工作,因为你在User实体上有两个导航属性,这将导致在Address表中有两个不同的FK列,它们必须为空,否则每个地址对于某些用户来说都必须是主要和次要的。
正确的模型使用默认映射进行映射(不需要流畅映射),因为它创建了具有两个FK的用户。address与user是两个一对多的关系,因为在理论上确实可以有多个用户使用相同的地址。
另一种选择是将关系建模为多对多,其中连接表将建模为具有附加属性AddressType的实体。
如果你真的想要遵循你当前的模型,你必须使用这个:
modelBuilder.Entity<User>()
.HasOptional(u => u.PrimaryAddress)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(u => u.SecondaryAddress)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);它将在Address表中创建两个额外的FK列,并且关系本身将是一对多的(一个用户可以有多个地址)。原因是强制执行一对一需要FK的唯一性,而当前EF版本不支持唯一键。您可以在后期处理中对FK列添加唯一约束(通过custom DB initializer或使用EntityFramework.Migrations),但这会导致其他问题。空值在SQL中被视为有效值,因此如果您对可为空的列具有唯一约束,则只有一条记录可以具有空值。
https://stackoverflow.com/questions/8588356
复制相似问题