我使用实体框架6.0.2将一些简单的手工编码模型映射到现有的数据库结构中。目前的主要模式是:
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可以加载该模型的子记录。)
映射很简单,我试图尽可能地显式(因为随着应用程序的增长,就会有一些不那么直观的映射):
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会尝试将其映射到数据库。就像这样:
private OccurrenceHistory CurrentHistory { get; set; }
(在模型内部,对于维护该字段和其他私有操作,我有一些逻辑。)当EF生成一个SELECT
语句时,它最终会查找一个名为CurrentHistory_ID
的列,该列当然不存在。
我可以公开该属性,并将映射设置为忽略它:
Ignore(o => o.CurrentHistory);
但我不想这房子公之于众。模型将在内部跟踪应用程序代码不应该看到的一些信息。
有没有办法让EF忽略任何和所有私人成员?即使是按地图计算?我特别想这样做,而不必向模型本身添加EF数据注释,因为这不仅是一种漏洞百出的抽象(持久化无知的模型就会包含持久化信息),而且也意味着包含模型的域核心程序集将在任何地方都带有对EntityFramework.dll
的引用,这并不理想。
发布于 2014-02-18 13:14:56
一位同事向我介绍了博客文章,这导致了一种非常实用的方法。
所以我拥有的是私人财产:
private OccurrenceHistory CurrentHistory { get; set; }
问题的核心是我不能在映射中使用它:
Ignore(o => o.CurrentHistory);
因为,很明显,该属性是私有的,不能在此上下文中访问。博客文章建议公开一个引用私有属性的公共静态表达式:
private OccurrenceHistory CurrentHistory { get; set; }
public static readonly Expression<Func<Occurrence, OccurrenceHistory>> CurrentHistoryExpression = o => o.CurrentHistory;
然后,我可以在映射中引用这一点:
Ignore(Occurrence.CurrentHistoryExpression);
和任何事情一样,它是利与弊的混合体。但在这种情况下,我认为利大于弊。
优点:
EntityFramework.dll
的引用。缺点:
这个骗局破坏了封装,但只是轻微的破坏。使用代码仍然无法在实例上访问该属性或其值,它只能看到该属性是静态存在的。事实上,这并不是什么大事,因为开发者无论如何都能看到它。我觉得封装的精神仍然保留在模型的任何特定实例上。
https://stackoverflow.com/questions/21839131
复制相似问题