Entity Framework 4.0、PoCo 和查找表的导航属性
Posted
技术标签:
【中文标题】Entity Framework 4.0、PoCo 和查找表的导航属性【英文标题】:Entity Framework 4.0, PoCo & Navigation Properties for Lookup Tables 【发布时间】:2011-02-14 23:07:43 【问题描述】:我有以下型号
DeltaDirectionType,
int Id
string Name
Delta,
int Id
string Name
DeltaDirectionType DeltaDirectionType
Double Value
Trade
int Id
DateTime BusinessDate
IList<Delta> deltas
所以 DeltaDirectionType 是一个查找表,Trade 持有 Delta 的集合
在数据库中实现如下
DeltaDirectionTypes
Id int
Name varchar(max)
Deltas
Id int
Name varchar(max)
DeltaDirectionType_Id int
Trade_Id int
Value float
Trades
Id int
BusinessDate DateTime
Delta_Id int
当我从 Edmx 文件的代码生成模型时,并且(取消选中外键)因为我的模型没有这些属性。我的导航属性有问题。在 nHibernate 中这样的事情将是 DeltaDirectionType 和 Delta 的简单一对多映射,以及 Delta 和 Trades 的多对多映射但是,我如何首先让它认识到 DeltaDirectionType 是一个查找,然后让 Icollection 工作我。
我正在为此苦苦挣扎,Entity Framework 对你来说并不容易。我已经尝试过通常的方法,删除 EF 在一侧为您设置的导航属性,但随后您会遇到一些映射片段错误、未映射的属性等。
请帮助或指出正确的方向。
查找表是现实生活中的问题,不知道为什么使用 EF 实施起来如此困难。
非常感谢任何帮助
谢谢
【问题讨论】:
根据你说的,Delta 应该有一个 DeltaDirectionType 属性,而 DeltaDirectionType 有一个 Delta 对象的集合。这是你得到的吗?从你的描述我看不出来。为什么取消选中外键属性复选框?这些值可能会有所帮助... 【参考方案1】:您必须在模型中创建外键或导航属性来导航关系。
导航属性可以定义为单向,即从增量表到查找表。像这样的单向导航会将适当的属性添加到增量对象而不是循环表
【讨论】:
【参考方案2】:您所说的查找实际上是什么意思?除了 Delta 实体,您是否会直接映射 DeltaDirectionType_Name?
在 EF 中,您将获得 DeltaDirectionType 的导航属性,并且您可以通过此导航属性访问名称。如果您不喜欢它,可以将新属性添加到生成的 POCO 的部分类中,并直接在 Delta 实体中提供名称,例如:
public string DeltaDirectionTypeName
get
return DeltaDirectionType != null? DeltaDirectionType.Name : String.Empty;
唯一的问题是您不能在 Linq-To-Entities 查询中使用此属性。在查询中,您始终必须使用导航属性。
【讨论】:
以上是关于Entity Framework 4.0、PoCo 和查找表的导航属性的主要内容,如果未能解决你的问题,请参考以下文章
添加 [DataContract] 到 Entity Framework 6.0 POCO Template
Entity Framework工具POCO Code First Generator的使用
Entity Framework 4.1 RTW Code First - POCO 一对多是不是需要引用子实体和子实体主键?
virtual 关键字在 Entity Framework 4.1 POCO Code First 中可以产生啥影响?
Entity Framework工具POCO Code First Generator的使用(参考链接:https://github.com/sjh37/EntityFramework-Reverse