Как я могу использовать текущие API-конфигурации инфраструктуры объектов в моей собственной логике приложения?

Я использовал свободный интерфейс EF для отображения моих классов POCO в таблицы базы данных. Мне нужно использовать конфигурацию отображения в моей собственной логике приложения. В частности, скажем, у меня есть сущность "Продукт", и у меня есть следующее сопоставление для этой сущности:

public class ProductMap : EntityTypeConfiguration<Product>
{
    public ProductMap()
    {
        ....
        this.HasKey(t => t.ProductId);
        ...
    }
}

В моей логике приложения я хочу написать универсальный метод, который получает ключевое поле моей сущности (здесь ProductId). Если бы я использовал атрибуты аннотации данных, я мог бы найти свое ключевое свойство, используя отражение. Мой вопрос заключается в том, возможно ли достичь того же самого, когда я определяю свои сопоставления с помощью свободного API?


Спасибо, Дяхо. Я точно пришел к решению, которое вы предлагаете, но все же оно не является хорошим решением, так как структура сущностей не позволяет нам делать запросы, используя поле, которое не является чистым полем сущности. Возьмите следующий пример: я хочу написать универсальный метод, который возвращает сущность на основе ее идентификатора. Я пришел к следующему решению:

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

У вас есть лучшее предложение для этого сценария?

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 имущество

Другие вопросы по тегам