Есть ли способ получить доступ к первичному ключу, созданному в SaveChanges () из DBModelBuilder modelBuilder (Fluent API) - PullRequest
1 голос
/ 26 июня 2019

У меня есть свойство, основанное на идентификаторе сущности.Поэтому я стараюсь избегать следующего кода:

dbContext.SaveChanges();
entyty.propertyInQuestion = SomeFunkyMethod(entity.Id)
dbContext.SaveChanges();

Поэтому идея не в том, чтобы переопределить SaveChanges (), а в том, чтобы поместить SomeFunkyMethod где-нибудь в Fluent API.Мое лучшее предположение до сих пор заключалось в том, чтобы сделать это в ValueGenerator, но, похоже, он предназначен для разных целей.

1 Ответ

1 голос
/ 26 июня 2019

Если вам нужно использовать EF для этого, тогда ответ будет где-то между «нет» и «плохо».

Как насчет создания триггера БД, который обновляет свойство после вставки?

(в зависимости от вашей подсистемы БД, отправьте сюда)

CREATE FUNCTION some_funky_method() RETURNS trigger AS $$
BEGIN

    -- whatever implemenation of your logic
    NEW."UpdatedProperty" := NEW."Id" * 666;

    RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER update_property_on_insert
AFTER INSERT ON your_table
FOR EACH ROW
EXECUTE PROCEDURE some_funky_method();

ОБНОВЛЕНИЕ

Нет способа сделать это с EntityFramework и автоматически увеличенными идентификаторами.Идентификатор генерируется последовательностью БД во время вставки, и в этом все дело.Если вы не можете использовать триггер, любое другое решение было бы только уродливым хаком, приводящим к повторному вызову базы данных в какой-то момент.

Конечно, вы могли бы предсказать Id с помощью запроса состояния последовательности, но обычно это оченьплохая идея.

Однако, если есть возможность, есть еще один вариант - изменить первичный ключ с INT на GUID .На этом этапе вы можете самостоятельно сгенерировать Id и использовать его для всего до вставки.

public class MyEntity {
   public Guid Id { get; set; }
   public string SomethingElse { get; set; }
   (...)
}
entity.Id = Guid.NewGuid();
entity.SomethingElse = /* Do something with the Id */ entity.Id.ToString();
_db.SaveChanges();
...