【发布时间】:2012-04-11 00:35:45
【问题描述】:
我想创建与实体框架的条件关联。据我所知,我们无法创建条件外键,所以我无法在数据库服务器级别解决这个问题。 我有这样的表:
---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
现在,Property 表中的 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 中访问上下文对象,因此无法访问 Property EntityObject 中的 Value* 表。
那么,这种方法是正确的还是我应该怎么做?如果是真的,如何在 EntityObject 中获取实体上下文对象?
编辑:如果你不建议这种方法,你会建议什么?请与我们分享您的意见。我认为,这种方法的最佳替代方案可能是这样的:
---Property---
int id
string ValueString
int ValueInteger
bool ValueBoolean
etc...
但是这样,如果我想添加另一个值类型,我将不得不更改表结构,并且我将不得不更新我的项目中的实体和对象模型。我不能使用序列化对象,因为我需要过滤值上的数据。 编辑结束
【问题讨论】:
-
一些数据库 (Oracle) 允许这样的密钥。您没有提及您正在使用哪个数据库。话虽如此,这种设计并不适合标准 SQL DB 或 EF。我建议您以不同的方式解决您的问题。
-
谢谢 Craig,我正在使用 MS SQL Server。我可以通过代码中的额外公共函数来解决这个问题。但这只会让我的团队成员感到困惑,而且它会使事情变得更复杂。我需要这样的方法来使用(string)SomeProperty.Value 或(int)SomeProperty.Value。我不想实现额外的函数来获取属性的值。
标签: entity-framework foreign-keys associations conditional entityobject