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



我正在尝试使用EF来存储多种关系的关系,从而通过创建第三个表来防止冗余。但是,从我的观点来看,这三个表实际上并不存在,所以我不想为此模型。请考虑以下设置。

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

我希望EF以StructureInfo作为第三个表生成以下内容:

CREATE TABLE [dbo].[City] (
    [ID]          INT            IDENTITY (1, 1) NOT NULL,
    [Name]        NVARCHAR (MAX) NULL,
    [Inhabitants] INT            NOT NULL
);
CREATE TABLE [dbo].[Structure] (
    [ID]   INT            IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (MAX) NULL,
);
CREATE TABLE [dbo].[StructureInfo] (
    [ID]           INT IDENTITY (1, 1) NOT NULL,
    [Location]     INT NOT NULL,
    [City_ID]      INT NULL,
    [Structure_ID] INT NULL,
    CONSTRAINT [FK_dbo.StructureInfo_dbo.City_City_ID] FOREIGN KEY ([City_ID]) REFERENCES [dbo].[City] ([ID]),
    CONSTRAINT [FK_dbo.StructureInfo_dbo.Structure_Structure_ID] FOREIGN KEY ([Structure_ID]) REFERENCES [dbo].[Structure] ([ID])
);

从数据库的角度来看,这似乎是正确的事情,因为Location每个城市是不同的,但是概念Structure可能出现在许多城市中。Location是实体City与实体Structure之间关系的属性,因此应在单独的表中。但是,从OO角度来看,该单独的表没有目的,LocationStructure特定实例的属性。我对描述关系的模型没有兴趣。

我如何告诉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;}
}

编辑

,如果您没有与关系有关的属性,则必须存在关系表,因为您无法将"集合"作为数据库字段存储。您只是不需要在对象世界中介意。

您必须保持关联。卫星桌是绘制多一对许多人的常见做法。您无需摆脱这张桌子。

最新更新