我有以下两个数据库表。 “属性”表的目的是为用户提供在运行时为现有表引入更多字段的能力。因此,所有表的所有用户定义属性都将存储在一个“属性”表中。数据库没有物理限制。我的问题是如何在Entity Framework 6中在这两个表之间建立关联?
最佳答案
重新设计数据库,使其具有一个在用户定义的属性所有者(例如学校)和属性本身之间链接的表:
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)
)
通过这种设计,您现在可以为用户定义的字段提供数据库级的引用完整性。实体框架会将其公开为每个School实体(或通过
Attributes
与AttributeOwners
有FK关系的其他任何实体)上的Attributes集合。有一个小设计错误,如果您有两个都链接到
Schools
的表Colleges
和AttributeOwners
,则它们都可以指向相同的AttributeOwners.Id
值,因此它们将共享用户定义的属性值。您可以使用CHECK CONSTRAINT
(通过UDF检查其他表)来缓解这种情况,但是,每当将新表添加到设计中时,都需要对其进行更新。