Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6表名作为FK值_C#_Entity Framework_Entity Framework 6_Tablename_User Defined Fields - Fatal编程技术网

C# 实体框架6表名作为FK值

C# 实体框架6表名作为FK值,c#,entity-framework,entity-framework-6,tablename,user-defined-fields,C#,Entity Framework,Entity Framework 6,Tablename,User Defined Fields,我有以下两个DB表。“属性”表的目的是为用户提供在运行时为现有表引入更多字段的能力。因此,所有表的所有用户定义属性都将存储在一个“attributes”表中。数据库上没有物理约束。我的问题是如何在EntityFramework6中建立这两个表之间的关联 重新设计数据库,使其具有一个表,该表链接用户定义的属性持有者(例如学校)和属性本身: CREATE TABLE Schools ( Id bigint IDENTITY(1,1) PRIMARY KEY NOT NULL, Na

我有以下两个DB表。“属性”表的目的是为用户提供在运行时为现有表引入更多字段的能力。因此,所有表的所有用户定义属性都将存储在一个“attributes”表中。数据库上没有物理约束。我的问题是如何在EntityFramework6中建立这两个表之间的关联


重新设计数据库,使其具有一个表,该表链接用户定义的属性持有者(例如学校)和属性本身:

CREATE TABLE Schools (
    Id bigint IDENTITY(1,1) PRIMARY KEY NOT NULL,
    Name nvarchar(50) NOT NULL,
    AttributeOwnerId bigint -- This column should have both a FOREIGN KEY constraint on AttributeOwners.Id and a UNIQUE constraint (so no two schools can share the same user-defined attributes)
)

CREATE TABLE AttributeOwners (
    Id bigint IDENTITY(1,1) PRIMARY KEY NOT NULL
)

CREATE TABLE Attributes (
    Id bigint IDENTITY(1,1) PRIMARY KEY NOT NULL
    AttributeOwnerId bigint -- FOREIGN KEY constraint on AttributeOwners.Id
    Name nvarchar(50),
    Value nvarchar(50)
)
通过这种设计,您现在可以拥有用户定义字段的数据库级引用完整性。实体框架将在每个学校实体(或通过
AttributeOwners
属性有FK关系的任何其他实体)上公开此属性集合


存在一个小的设计缺陷,即如果您有两个表
Schools
Colleges
,它们都链接到
属性所有者
,那么它们可能都指向相同的
AttributeOwners.Id
值,以便共享用户定义的属性值。您可以通过使用检查其他表(通过UDF)的
检查约束
来缓解这种情况,但是,每当在设计中添加新表时,都需要更新该约束。

无法做到这一点,因为AttributeHolder表将变大。有没有办法通过使用tablename@SadiqKhoja我们谈的有多大?请记住,SQL Server可以处理具有数十亿行的表,而不会出现任何性能问题,特别是考虑到该表只有一列。@SadiqKhoja此设计意味着您只需要为每个对象增加8或16个字节(取决于主键的大小(
int
bigint
)假设它们首先都需要用户定义的属性。@Dai yes超过十亿条记录+插入和删除操作的数量将随着时间的推移而增加well@SadiqKhoja不过,我非常怀疑您的系统实际上有10亿行。使用存储表名的系统(在
attributes.TableName
中)对于每个属性值,它将使用比我的解决方案多得多的空间。这被称为多态关联,如果您阅读此内容,您会感到气馁:是的,这看起来几乎像映射TPH。如果首先使用数据库,这几乎是直截了当的(这里的disciminator是
tableName
)。如果先使用代码,则需要正确映射,请参见此