我正在尝试使用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角度来看,该单独的表没有目的,Location
是Structure
特定实例的属性。我对描述关系的模型没有兴趣。
我如何告诉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;}
}
编辑
,如果您没有与关系有关的属性,则必须存在关系表,因为您无法将"集合"作为数据库字段存储。您只是不需要在对象世界中介意。
您必须保持关联。卫星桌是绘制多一对许多人的常见做法。您无需摆脱这张桌子。