【发布时间】:2012-05-23 21:16:47
【问题描述】:
我使用 EF fluent API 将我的 POCO 类映射到数据库表。我需要在我自己的应用程序逻辑中使用映射配置。更具体地说,让 说我有实体“产品”,我有这个实体的以下映射:
public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
....
this.HasKey(t => t.ProductId);
...
}
}
在我的应用程序逻辑中,我想编写一个通用方法来获取我的实体的关键字段(此处为 ProductId)。 如果我使用了数据注释属性,我可以使用反射找到我的关键属性。我的问题是,当我使用 fluent API 定义映射时,基本上可以实现相同的目标吗?
感谢帝豪。我完全采用了您建议的解决方案,但它仍然不是一个好的解决方案,因为实体框架不允许我们使用非纯实体字段的字段进行查询。举个例子:我想写一个泛型方法,它根据它的 id 返回一个实体。我得出以下解决方案:
public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey>
{
return _context.Set<TModel>().where(e => e.Id == id).FirstOrDefault();
}
但此代码不起作用,因为实体框架抱怨e.Id 不是驱动实体类的字段(它是父类的字段)。当然,可以通过将Set<TModel>() 转换为列表(如下所示)来强制提前执行查询来解决此问题。但这在性能方面很糟糕,因为它将所有实体加载到内存中以检索单个实体。
public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey>
{
return _context.Set<TModel>().ToList().where(e => e.Id == id).FirstOrDefault();
}
您对这种情况有更好的建议吗?
【问题讨论】:
标签: .net entity-framework poco or-mapper