Как выполнить код, когда сущность сохраняется в базе данных с помощью Entity-Framework code-first? - PullRequest
0 голосов
/ 15 мая 2011

Есть ли хороший способ выполнить код, когда объект сохраняется в базе данных с помощью EF / code-first?

У меня есть свойство Url на многих моих объектах. Если URL-адрес не был указан явно, я хотел бы рассчитать его при сохранении объекта, например ::

public void OnModelSaving()
{
    // If a URL has not been specified, generate one from the name.
    if (this.Url == null)
    {
        this.Url = Helper.GenerateSafeUrl(this.Title);
    }
}

В идеале, я бы хотел, чтобы весь этот код хранился внутри Модели, но, поскольку у меня нет базового / частичного класса, принадлежащего EF, я подозреваю, что если это возможно, мне придется его зарегистрировать / подключить в другом месте. Вопрос - возможно ли это, и если да, то как мне подключить его?

1 Ответ

1 голос
/ 15 мая 2011

Единственный способ - переопределить метод SaveChanges в вашем контексте, выполнить итерацию по измененным сущностям и проверить Url

public override int SaveChanges()
{
    var entities = ChangeTracker.Entries()
                                .Where(e => e.State == EntityState.Added || 
                                            e.State == EntityState.Modified)
                                .Select(e => e.Entity())
                                .OfType<YourEntityType();

    foreach (var entity in entities)
    {
        entity.Url = ...;
    }

    return base.SaveChanges();
}

Если у вас много типов сущностей, предоставляющих Url, вы можете попробоватьопределить интерфейс с этим Url, реализованным всеми этими типами сущностей, и в OfType использовать этот интерфейс.

...