C# 如何告诉EF将我的模型放入多个表中以防止冗余?

C# 如何告诉EF将我的模型放入多个表中以防止冗余?,c#,entity-framework,C#,Entity Framework,我试图使用EF来存储多个关系,通过创建第三个表来防止冗余。然而,从我的OO观点来看,第三个表实际上并不存在,所以我不想为它建立一个模型。请考虑以下设置: public class City { public int ID { get; set; } public string Name { get; set; } public int Inhabitants { get; set; } public virtual ICollection<Structur

我试图使用EF来存储多个关系,通过创建第三个表来防止冗余。然而,从我的OO观点来看,第三个表实际上并不存在,所以我不想为它建立一个模型。请考虑以下设置:

public class City
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Inhabitants { get; set; }

    public virtual ICollection<Structure> Structures { get; set; }
}

public class Structure
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Location { get; set; }

    public virtual ICollection<City> Cities { get; set; }
}
从数据库的角度来看,这似乎是正确的做法,因为每个城市的
位置
不同,但是
结构的概念可能会出现在许多城市<代码>位置
是实体<代码>城市和实体<代码>结构之间关系的属性,因此应位于单独的表中。但是,从OO的角度来看,这个单独的表没有任何用途,
位置
结构的特定实例的属性。我对描述这种关系的模型不感兴趣


我如何告诉EF仅从我创建的两个模型中创建如上所述的表,以便EF在使用信息时在需要时进行内部联接?

您必须保持关联。卫星表是多对多映射的常见做法。您不需要删除此表。

如果位置是关系的属性,则无法避免使用关系对象

EF将创建一个“对象世界中不存在”表来管理n对n关系,如果它只保留“关系”,但如果关系具有特定属性,则关系必须作为类型(和表)存在

即使在对象世界中,它也不是结构实例的属性,因为正如您所说,一个结构可能出现在许多城市中(因此一个结构实例可能与许多城市实例相关:因此结构实例的位置值不能不同)

所以你应该有

public class City {
    public virtual ICollection<CityStructure> CityStructures {get;set;}
}

public class Structure {
    public virtual ICollection<CityStructure> CityStrucutres {get;set;}
}

public class CityStructure {
    public int Location {get;set;}
    public virtual City City {get;set;}
    public virtual Structure Structure {get;set;}
}
公共级城市{
公共虚拟ICollection CityStructures{get;set;}
}
公共阶级结构{
公共虚拟ICollection citystructures{get;set;}
}
公共级城市结构{
公共int位置{get;set;}
公共虚拟城市城市{get;set;}
公共虚拟结构结构{get;set;}
}
编辑


如果没有与关系相关的属性,则必须存在关系表,因为不能将“集合”存储为数据库字段。你不必在意对象世界。

+1-我还要补充一点,如果你不愿意改变对象模型来描述关系,那么这可能是你没有构建分层应用程序的一个迹象。
public class City {
    public virtual ICollection<CityStructure> CityStructures {get;set;}
}

public class Structure {
    public virtual ICollection<CityStructure> CityStrucutres {get;set;}
}

public class CityStructure {
    public int Location {get;set;}
    public virtual City City {get;set;}
    public virtual Structure Structure {get;set;}
}