我有User
,可能有零个或一个Profile
。
从代码的角度来看,如果我可以从Profile
访问User
(因为我会更频繁地访问用户信息,然后是其配置文件),这应该会更方便,但这与EF Code First冲突:
class User
{
public int Id { get; set; }
[ForeignKey("Id")]
public virtual Profile Profile { get; set; }
}
class Profile
{
public int Id { get; set; }
}
这个,放入DbContext,将创建表格,在没有{= 1}}之前创建User
的情况下我无法创建表格。不好,因为Profile
是明显的原则。
最简单的(对于愚蠢的I)解决方案显而易见:
User
这给了我更多预期的数据库行为。
但是......我觉得这个解决方案并不是最好的方法。例如,我无法使用延迟加载通过所有配置文件访问所有用户。
所以问题是“如何正确设置一对一/一关系(通过DataAnnotation和FluentAPI)?”
换句话说,“如何正确设置”一个class User
{
public int Id { get; set; }
}
class Profile
{
public int Id { get; set; }
[ForeignKey("Id")]
public virtual User User { get; set; }
}
- 到 - 零/一个User
“关系?”
也许我认为这完全错了......
答案 0 :(得分:2)
编辑:
在删除解决方案时添加了级联。
试试这个
public class User
{
public int Id { get; set; }
public int? UserProfileId { get; set; }
public virtual UserProfile Profile { get; set; }
}
public class UserProfile
{
public int Id { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
}
和
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasOptional(x => x.Profile).WithRequired(x => x.User).WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
}
答案 1 :(得分:1)
感谢德拉卡。他的提议引导我找到了解决方案:
class User
{
public int Id { get; set; }
[ForeignKey("Id")]
public virtual Profile Profile { get; set; }
}
class Profile
{
public int Id { get; set; }
[Required, ForeignKey("Id")]
public virtual User User { get; set; }
}
所以诀窍是由Required
完成的,它标志着定义它的实体是依赖的,而另一个是主体。并且它在两个表中保存了一个collumn(对于外键id)。
只剩下一个问题:删除Profile
时如何确保级联删除User
?