首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >告诉EF 6忽略私有财产

告诉EF 6忽略私有财产
EN

Stack Overflow用户
提问于 2014-02-17 20:57:37
回答 1查看 2.2K关注 0票数 2

我使用实体框架6.0.2将一些简单的手工编码模型映射到现有的数据库结构中。目前的主要模式是:

代码语言:javascript
运行
复制
public class Occurrence
{
    public int ID { get; set; }
    public Guid LegacyID { get; set; }
    public string Note { get; set; }
    public virtual ICollection<OccurrenceHistory> History { get; set; }
}

( OccurrenceHistory模型实际上与此无关,但该部分运行良好,EF可以加载该模型的子记录。)

映射很简单,我试图尽可能地显式(因为随着应用程序的增长,就会有一些不那么直观的映射):

代码语言:javascript
运行
复制
public class OccurrenceMap : EntityTypeConfiguration<Occurrence>
{
    public OccurrenceMap()
    {
        ToTable("Occurrence");
        HasKey(o => o.ID);
        Property(o => o.ID).IsRequired().HasColumnName("ID");
        Property(o => o.LegacyID).IsRequired().HasColumnName("LegacyID");
        Property(o => o.Note).IsUnicode().IsOptional().HasColumnName("Note");
    }
}

但是如果我将私有属性添加到模型中,EF会尝试将其映射到数据库。就像这样:

代码语言:javascript
运行
复制
private OccurrenceHistory CurrentHistory { get; set; }

(在模型内部,对于维护该字段和其他私有操作,我有一些逻辑。)当EF生成一个SELECT语句时,它最终会查找一个名为CurrentHistory_ID的列,该列当然不存在。

我可以公开该属性,并将映射设置为忽略它:

代码语言:javascript
运行
复制
Ignore(o => o.CurrentHistory);

但我不想这房子公之于众。模型将在内部跟踪应用程序代码不应该看到的一些信息。

有没有办法让EF忽略任何和所有私人成员?即使是按地图计算?我特别想这样做,而不必向模型本身添加EF数据注释,因为这不仅是一种漏洞百出的抽象(持久化无知的模型就会包含持久化信息),而且也意味着包含模型的域核心程序集将在任何地方都带有对EntityFramework.dll的引用,这并不理想。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 13:14:56

一位同事向我介绍了博客文章,这导致了一种非常实用的方法。

所以我拥有的是私人财产:

代码语言:javascript
运行
复制
private OccurrenceHistory CurrentHistory { get; set; }

问题的核心是我不能在映射中使用它:

代码语言:javascript
运行
复制
Ignore(o => o.CurrentHistory);

因为,很明显,该属性是私有的,不能在此上下文中访问。博客文章建议公开一个引用私有属性的公共静态表达式:

代码语言:javascript
运行
复制
private OccurrenceHistory CurrentHistory { get; set; }
public static readonly Expression<Func<Occurrence, OccurrenceHistory>> CurrentHistoryExpression = o => o.CurrentHistory;

然后,我可以在映射中引用这一点:

代码语言:javascript
运行
复制
Ignore(Occurrence.CurrentHistoryExpression);

和任何事情一样,它是利与弊的混合体。但在这种情况下,我认为利大于弊。

优点:

  • 域核心程序集不需要携带对EntityFramework.dll的引用。
  • 持久性映射完全封装在DAL程序集中。

缺点:

  • 模型需要公开一些关于其内部工作的信息。

这个骗局破坏了封装,但只是轻微的破坏。使用代码仍然无法在实例上访问该属性或其值,它只能看到该属性是静态存在的。事实上,这并不是什么大事,因为开发者无论如何都能看到它。我觉得封装的精神仍然保留在模型的任何特定实例上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21839131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档