У меня следующие две таблицы DB. Цель таблицы «attributes» - предоставить пользователю возможность вводить больше полей для существующих таблиц во время выполнения. Таким образом, все пользовательские атрибуты для всех таблиц будут храниться в одной таблице «атрибуты». Физических ограничений для базы данных нет. Мой вопрос заключается в том, как установить связь между этими двумя таблицами в Entity Framework 6?Entity Framework 6 tablename как значение FK
ответ
Re-дизайн базы данных, чтобы иметь таблицу, которая связывает между определенным пользователем атрибутами держателями (например, школа), а сами атрибутами:
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 будет раскрывать это как коллекцию атрибутов для каждого школьного объекта (или любого другого объекта, который имеет отношение FK с Attributes
через AttributeOwners
).
Существует небольшой дизайн ошибка в том, что если у вас есть две таблицы Schools
и Colleges
, которые, как ссылку на AttributeOwners
то они могли как указывают на то же AttributeOwners.Id
значение, так что они разделяют пользователя defiend значения атрибутов. Вы можете уменьшить это, используя CHECK CONSTRAINT
, который проверяет другие таблицы (посредством UDF), однако это нужно будет обновлять, когда к вашему дизайну добавляются новые таблицы.
славный трюк sir;) – VeNoMiS
не может этого сделать, потому что таблица AttributeHolder станет огромной , любым способом сделать это, используя tablename –
@SadiqKhoja Насколько мы велики? Помните, что SQL Server может обрабатывать таблицы с * миллиардами * строк без каких-либо проблем с производительностью, особенно учитывая, что таблица содержит только 1 столбец. – Dai
Это называется * полиморфными ассоциациями *, и вы будете обескуражены, если вы прочтете это: http://stackoverflow.com/q/13953675/861716 –
да это выглядит почти так же, как отображение TPH. Если вы используете базу данных сначала, это почти прямолинейно (дискаминатором здесь является 'tableName'). Если вы используете код сначала, вам нужно правильно его сопоставить, см. Этот https://msdn.microsoft.com/en-us/data/jj591617 –