EF:适当的一对一/一关系

时间:2013-01-09 14:53:46

标签: entity-framework ef-code-first

我有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“关系?”

也许我认为这完全错了......

2 个答案:

答案 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