【问题标题】:Entity Framework 6 tablename as FK valueEntity Framework 6 表名作为 FK 值
【发布时间】:2015-10-09 18:20:08
【问题描述】:

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

【问题讨论】:

标签: c# entity-framework entity-framework-6 tablename user-defined-fields


【解决方案1】:

重新设计您的数据库,使其具有一个表,该表将用户定义的属性持有者(例如学校)与属性本身联系起来:

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)
)

通过这种设计,您现在可以为用户定义的字段提供数据库级别的引用完整性。 Entity Framework 会将其作为每个 School 实体(或通过 AttributeOwnersAttributes 具有 FK 关系的任何其他实体)上的 Attributes 集合公开。

有一个小的设计错误,如果您有两个表 SchoolsColleges 都链接到 AttributeOwners 那么它们都可以指向相同的 AttributeOwners.Id 值,因此它们将共享 user-defiend 属性价值观。您可以通过使用检查其他表(通过 UDF)的 CHECK CONSTRAINT 来缓解这种情况,但是每当将新表添加到您的设计时都需要更新。

【讨论】:

  • 不能这样做,因为 AttributeHolder 表会变得很大。使用 tablename 的任何方式来做到这一点
  • @SadiqKhoja 我们说的有多大?请记住,SQL Server 可以处理具有 十亿 行的表而不会出现任何性能问题,尤其是考虑到该表只有 1 列。
  • @SadiqKhoja 这种设计意味着每个对象只需要 8 或 16 个额外字节(取决于主键的大小(intbigint),假设它们甚至都需要 user-首先定义属性。
  • @Dai 是的,超过十亿条记录+插入和删除操作的数量也会增加
  • @SadiqKhoja 我非常怀疑您的系统实际上有十亿行。使用存储每个属性值的表名(在attributes.TableName 中)的系统将使用比我的解决方案相当更多的空间。
猜你喜欢
  • 2020-01-14
  • 2013-11-02
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多