实体框架基数为1..1或1..0关系

时间:2014-05-03 11:48:40

标签: c# .net entity-framework ef-code-first

我有一个实体,其中有一个自我参考,以便会员可以有一个必须是会员的证人,也可能有一个必须是会员的参考。我将其建模如下;

public class Member
    {
        public int Id { get; set; }

        //omitted for brevity
        public int? WitnessId { get; set; }
        public virtual Member Witness { get; set; }

        public int? ReferenceId { get; set; }
        public virtual Member Reference { get; set; }
    }

当我在包管理器控制台上运行update-database时,出现以下错误: " XXX.Client.Entities.Member'和' XXX.Client.Entities.Member'。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。"

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

尝试用这种方式定义与流畅的api的关系(适合我):

        modelBuilder.Entity<Member>().HasKey(x => x.Id);
        modelBuilder.Entity<Member>().HasOptional(x => x.Witness)
            .WithMany()
            .HasForeignKey(m => m.WitnessId);
        modelBuilder.Entity<Member>().HasOptional(x => x.Reference)
            .WithMany()
            .HasForeignKey(m => m.ReferenceId);

答案 1 :(得分:0)

这看起来有效:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {


        modelBuilder.Entity<Member>().
            HasOptional(e => e.Witness).
            WithMany().
            HasForeignKey(m => m.WitnessID);

        modelBuilder.Entity<Member>().
            HasOptional(e => e.Reference).
            WithMany().
            HasForeignKey(m => m.ReferenceID);

        base.OnModelCreating(modelBuilder);

    }

答案 2 :(得分:0)

对于我们这些喜欢在类中派生出来自EntityTypeConfiguration的人来说,这也适用

class MemberEntityConfiguration : EntityTypeConfiguration<Member>
{
    public MemberEntityConfiguration()
    {
        HasKey(x => x.Id);
        HasOptional(x => x.Witness).WithMany().HasForeignKey(m => m.WitnessId);
        HasOptional(x => x.Reference).WithMany().HasForeignKey(m => m.ReferenceId);
    }
}