我尝试使用EF Code First:
区域有两个表:用户和区域。一个用户属于一个必需区域,一个区域可以有零个或一个用户(作为管理员)。然后:
用户* .. 1区域和 用户0..1区域
用户类:
public class User {
public int UserId { get; set; }
public string Name { get; set; }
[ForeignKey("Area")]
public int AreaId { get; set; }
[InverseProperty("Users")]
public virtual Area Area { get; set; }
public virtual Area AreaTitular { get; set; }
}
The Areas类:
public class Area {
public int AreaId { get; set; }
public string Name { get; set; }
public List<User> Users { get; set; }
[ForeignKey("User")]
public int? UserId { get; set; }
[InverseProperty("AreaTitular")]
public virtual User User{ get; set; }
}
update-database命令的错误:
无法确定类型之间关联的主要结尾&#39; TestEntityFrameworkCodeFirst.Model.Area&#39;和&#39; TestEntityFrameworkCodeFirst.Model.User&#39;。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。
非常感谢任何帮助:)
我不完全确定这是否可以:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Area>()
.HasOptional(i => i.User)
.WithOptionalDependent();
base.OnModelCreating(modelBuilder);
}
刚刚在Context类的OnModelCreating上添加了这个。这就是它在SQL Server中的外观:
答案 0 :(得分:3)
问题在于您的一对一关系的配置,因为一端必须是主体,第二端必须是依赖。当您配置这种关系时,Entity Framework要求依赖的主键也是外键。因此,不要将UsuarioId
映射为FK,否则,EF要求FK也必须是PK(评论该财产)。另一个问题是EF不知道谁是你们关系中的主体。要指定谁是主体,请使用Required
属性。例如,如果您在AreaTitular
上添加此属性,则指定要创建User
,保存更改后必须设置AreaTitular
属性,因此在这种情况下您的主体是Area
,dependend是User
,但这是假设的情节,我不知道你的逻辑。
查看此帖子了解更多信息:
现在,可以将两端都指定为可选,但其中一个必须是主体。如果是这种情况,我建议您注释数据注释属性并使用Fluent Api以这种方式配置关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasRequired(a => a.Area)
.WithMany(c => c.Usuarios)
.HasForeignKey(a => a.AreaId);
modelBuilder.Entity<Area>()
.HasOptional(a => a.Usuario)
.WithOptionalPrincipal(u => u.AreaTitular);
}
我建议您阅读此page以更好地理解一对一的关系。