Я хочу создать условную связь с Entity Framework. Насколько я знаю, мы не можем создавать условные внешние ключи, поэтому я не могу решить эту проблему на уровне сервера баз данных. У меня есть таблицы так:Условная ассоциация с инфраструктурой Entity
---Property---
int id
string Name
int TypeId --> Condition on this.
int ValueId
---ValueString---
int id
string Value
---ValueInteger---
int id
int Value
---ValueBoolean---
int id
bool Value
Теперь поле TypeId в таблице свойств содержит тип значения. Например, если TypeID == 0, то ValueId указывает на ValueString таблицу, если TypeId == 1, то ValueId указывает на ValueInteger стол и т.д.
Я сделал некоторые обходной путь, но я застрял где-то:
у меня есть перечисление вроде этого:
public enum PropertyType
{
String = 0,
Integer = 1,
Boolean = 2,
DateTime = 3,
List = 4
}
и я осуществил частичный класс вроде этого:
public partial class ProductProperty : EntityObject
{
public object Value
{
get
{
switch (Property.Type)
{
case PropertyType.String:
return ValueString.Where(w => w.id == this.ValueId).Select(s => s);//how to return?
break;
case PropertyType.Integer:
return ValueInteger.Where(w => w.id == this.ValueId).Select(s => s) //how to return?
break;
case PropertyType.Boolean:
return ValueBoolean.Where(w => w.id == this.ValueId).Select(s => s) //how to return?
break;
case PropertyType.DateTime:
return ValueDateTime.Where(w => w.id == this.ValueId).Select(s => s) //how to return?
break;
default:
return null;
break;
}
}
set
{
}
}
}
Но я не знаю, как достичь объект контекста в пределах EntityObject , поэтому я не смог получить таблицы Value * в Property EntityObject.
Итак, этот подход верен или что мне делать? если это правда, как я могу получить объект контекста объекта в EntityObject?
Редактировать: Если вы не предлагаете такой подход, что бы вы предложили? Пожалуйста, поделитесь своим мнением с нами. Я думаю, что лучшая альтернатива такого подхода может быть что-то вроде этого:
---Property---
int id
string ValueString
int ValueInteger
bool ValueBoolean
etc...
Но этот путь, если я хочу добавить еще один тип значения, я должен изменить структуру таблицы, и я должен буду обновлять объект и объектные модели в моем проекте. Я не могу использовать сериализованные объекты, потому что мне нужно фильтровать данные по значению. Edit закончилась
Некоторые БД (Oracle) допускают такой ключ. Вы не упоминаете, какую БД вы используете. Сказав это, этот дизайн не подходит для стандартной SQL DB или EF. Я бы посоветовал вам решить вашу проблему по-другому. –
Спасибо Крейг, я использую MS SQL Server. Я могу решить эту проблему с помощью дополнительных публичных функций в коде. Но это только смущает членов моей команды, и это делает вещи более сложными. Мне нужен такой подход, как использовать (string) SomeProperty.Value или (int) SomeProperty.Value. Я не хочу реализовывать дополнительные функции для получения значения свойства. – oruchreis