【问题标题】:Entity Framework DB First: Convert Associative Table to Navigation PropertiesEntity Framework DB First:将关联表转换为导航属性
【发布时间】:2026-01-13 13:40:01
【问题描述】:

我使用的是实体框架数据库优先,但我想从 Code First 范例中复制以下行为:

在 Entity Framework Code First 中,您可以执行以下操作:

public class Thing
{
    public int ID { get; set; }
    ICollection<Stuff> Stuffs { get; set; }
}

public class Stuff
{
    public int ID { get; set; }
    ICollection<Thing> Things { get; set; }
}

并且数据库会生成关联表来表示多对多关系。

我将 Database First 与旧数据库一起使用。我拉入实体,它包括表示我们两个表之间的多对多关系的关联表。

由于关联表是作为实体包含的,因此导航属性如下:

public class Thing
{
    public int ID { get; set; }
    public ICollection<ThingStuff> ThingStuffs { get; set; }
}

public class ThingStuff
{
    public int ThingID { get; set; }
    public int StuffID { get; set; }
    ICollection<Thing> Things { get; set; }
    ICollection<Stuff> Stuffs { get; set; }
}

public class Stuff
{
    public int ID { get; set; }
    public ICollection<ThingStuff> ThingStuffs { get; set; }
}

所以要导航,我必须:

var stuff = Thing.ThingStuffs.Select(ts => ts.Stuff);

代替:

var stuff = Thing.Stuffs;

所以问题是:

有没有办法删除表示关联的实体(ThingStuff)并告诉 EntityFramework 现有表以创建多对多导航属性?

【问题讨论】:

  • 我认为真正的联结表具有比两个外键或单独的主键更多的属性,否则 EF 不会将其合并到概念模型中。对吗?
  • 除了@GertArnold 所说的,如果其中一个外键可以为空,那么 EF 数据库首先还将关联表作为单独的实体包含在内。

标签: entity-framework entity-framework-5 .net-4.5 ef-database-first database-first


【解决方案1】:

如 fluent api 文档中所述,映射复合键不是更好吗? http://msdn.microsoft.com/en-us/data/jj591617.aspx

【讨论】:

  • 据我所知,您不能将 Code First Fluent API 与 Database First Paradigm 一起使用