1

我使用 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();
}

您对这种情况有更好的建议吗?

4

1 回答 1

0

我们遇到了类似的情况。我们无法找到一个很好的解决方案,所以我很想听听反馈。我们的解决方案是创建一个抽象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-05-23T21:58:56.490 回答