【问题标题】:How can I use the entity framework fluent API configurations in my own application logic?如何在自己的应用程序逻辑中使用实体框架流式 API 配置?
【发布时间】: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&lt;TModel&gt;() 转换为列表(如下所示)来强制提前执行查询来解决此问题。但这在性能方面很糟糕,因为它将所有实体加载到内存中以检索单个实体。

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


    【解决方案1】:

    我们遇到了类似的情况。我们无法找到一个很好的解决方案,所以我很想听听反馈。我们的解决方案是创建一个抽象的ModelBase 类,它有两个对我们所有模型都“通用”的字段:

    public abstract class ModelBase<T>
    {
        /// <summary>
        /// The id of the model object
        /// </summary>
        public virtual T Id { get; set; }
    
        /// <summary>
        /// The date the model object was created
        /// </summary>
        public virtual DateTime CreateDate { get; set; }
    }
    

    然后我们的所有模型都继承自该类:

    public class Product : ModelBase<int>
    {
        public override int Id
        {
            get { return ProductId; }
            set { ProductId = value; }
        }
    
        public int ProductId { get; set; }
        ...
    }
    

    这样你总是知道实体的关键字段。注意:您将设置 EF 数据库映射以忽略 Id 属性

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多