我使用 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();
}
您对这种情况有更好的建议吗?