Используйте HasKey, чтобы найти сущность без явного указания всех ключей в запросе - PullRequest
0 голосов
/ 22 февраля 2020

С EF вы можете указать составной ключ с HasKey, поэтому я предполагаю, что есть способ использовать сущность в качестве параметра некоторого API, чтобы найти его в базе данных, но я не могу понять, как.

API Find, который я надеялся использовать, требует массива значений ключей, но я ищу что-то вроде этого:

var setting = new Setting { Name = "WindowSize" };
setting = context.Find(setting);

Поскольку я могу указать все ключи с помощью modelBuilder.Entity<Setting>.HasKey(s => new { s.Name }) должен быть способ повторно использовать его. Знаете ли вы API или трюк , чтобы заставить его работать таким образом?

Модель Setting является заменяемой и может иметь другие ключевые столбцы. Я хотел бы иметь возможность автоматически найти его без необходимости дважды указывать критерии.

Это означает, что может быть:

modelBuilder.Entity<Setting>.HasKey(s => new { s.Name, s.Version })

Я бы хотел, чтобы это определение было повторно использовано для запросов без меня, чтобы сказать Find("name", "version") et c. но context.SomeAPI(settingWithTwoKeys).

1 Ответ

1 голос
/ 22 февраля 2020

Нет ничего встроенного в EF Core, который делает это, но нетрудно написать метод расширения для .Find, который бы сделал это за вас. Вот пример метода (не проверенный), который делает это.

(Примечание: когда вы вызываете этот метод, вы можете полагаться на обобщенный c вывод аргумента и передавать только саму сущность - как context.Find(settingWithTwoKeys)).

public static TEntity Find<TEntity>(this DbContext context, TEntity keyObject) 
{
    var entityType = context.Model.FindEntityType(typeof(TEntity));
    var pk = entityType.FindPrimaryKey();

    var keyArgs = new List<object>();
    foreach(var pkProperty in pk.Properties)
    {
        var propValueInKeyObject = pkProperty.PropertyInfo.GetValue(keyObject);
        keyArgs.Add(propValueInKeyObject);
    }

    return context.Find<TEntity>(keyArgs);
}

Ваш второй вопрос - зачем HasKey. Вы используете его каждый раз, когда ваша реализация БД не соответствует EF Convention. Ваша сущность Setting является хорошим примером. В EF нет соглашения, позволяющего автоматически определять, что Name и Version являются ПК. Вам нужно использовать HasKey в конструкторе моделей, чтобы сказать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...