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

c# -  Entity Framework 6表名作为FK值-LMLPHP

c# -  Entity Framework 6表名作为FK值-LMLPHP

最佳答案

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

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实体(或通过AttributesAttributeOwners有FK关系的其他任何实体)上的Attributes集合。

有一个小设计错误,如果您有两个都链接到Schools的表CollegesAttributeOwners,则它们都可以指向相同的AttributeOwners.Id值,因此它们将共享用户定义的属性值。您可以使用CHECK CONSTRAINT(通过UDF检查其他表)来缓解这种情况,但是,每当将新表添加到设计中时,都需要对其进行更新。

08-26 19:46