【问题标题】:Entity Framework cardinality in a 1..1 or 1..0 relationship1..1 或 1..0 关系中的实体框架基数
【发布时间】:2014-05-03 11:48:40
【问题描述】:

我有一个实体,它有一个自我参考,这样一个成员可以有一个必须是成员的见证人,也可以有一个必须是成员的参考。我对此建模如下;

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; }
    }

当我在包管理器控制台上运行更新数据库时,我收到以下错误: “XXX.Client.Entities.Member”和“XXX.Client.Entities.Member”。必须使用关系流式 API 或数据注释显式配置此关联的主体端。

知道如何解决这个问题吗?

【问题讨论】:

  • 和fluent api的关系配置了吗?我们应该帮助您吗?
  • @mr100 是的,我用fluent api配置了关系。我试过modelBuilder.Entity<Member>().HasOptional(x=>x.Witness)...之类的东西,但还是不行。
  • 请将then添加到您的邮政编码中,以便对这种关系进行流畅的api配置。

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


【解决方案1】:

尝试以这种方式定义与 fluent 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);

【讨论】:

    【解决方案2】:

    这看起来有效:

        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);
    
        }
    

    【讨论】:

    • thanx,这与 mr100 回答的类似。
    【解决方案3】:

    这也适用于我们这些喜欢在类中使用从 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多