【问题标题】:Entity Framework Many to Many Relation on same entity with additional parameters具有附加参数的同一实体上的实体框架多对多关系
【发布时间】:2015-06-13 21:38:30
【问题描述】:

我有城市实体:

public class City
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public virtual ICollection<CityDistance> CityDistances { get; set; }

    }

我想保持城市之间的距离。
1.如何在代码优先实体框架6中实现这一点?

这是我的其他课程:

 public class CityDistance
    {
        [Key, Column(Order = 0)]
        public int CityAID { get; set; }
        [Key, Column(Order = 1)]
        public int CityBID { get; set; }
        public virtual City CityA { get; set; }
        public virtual City CityB { get; set; }

        public double Distance { get; set; }
    }
  1. 这是正确的设计吗?

当我运行“添加迁移距离”时,结果如下。
3. 为什么要增加一个名为“City_ID”的外键列?

CreateTable(
                "dbo.CityDistances",
                c => new
                    {
                        CityAID = c.Int(nullable: false),
                        CityBID = c.Int(nullable: false),
                        Distance = c.Double(nullable: false),
                        City_ID = c.Int(),
                    })
                .PrimaryKey(t => new { t.CityAID, t.CityBID })
                .ForeignKey("dbo.Cities", t => t.City_ID)
                .ForeignKey("dbo.Cities", t => t.CityAID, cascadeDelete: true)
                .ForeignKey("dbo.Cities", t => t.CityBID, cascadeDelete: true)
                .Index(t => t.CityAID)
                .Index(t => t.CityBID)
                .Index(t => t.City_ID);  

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-6


    【解决方案1】:

    这是因为 EF 就像一个简单的簿记员:CityACityB,这是两个外键,CityDistances,这是另一个外键,可以生成三个外键。

    EF 不知道您打算将CityDistances 用作CityACityB 关联的另一端()。您必须通过数据注释明确指出这一点:

    public class City
    {
        ...
    
        [InverseProperty("CityA"]
        public virtual ICollection<CityDistance> CityDistances { get; set; }
    
    }
    

    或通过流畅的映射:

    modelBuilder.Entity<City>()
                .HasMany(c => c.CityDistances)
                .WithRequired(cd => cd.CityA)
                .HasForeignKey(cd => cd.CityAID);
    

    (我含蓄地说,是的,这是正确的设计,至少在技术上是这样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 2013-11-24
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      相关资源
      最近更新 更多