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

SQL Compact 4.0 和 Entity Framework 4.0:图像/Blob 限制?