По моему мнению, стоит сказать, что с помощью недавно выпущенной EntityGraphOperations для Entity Framework Code First вы можете уберечь себя от написания некоторых повторяющихся кодов для определения состояний всех объектов в графе. Я автор этого продукта. И я опубликовал его в github , code-project ( включает пошаговую демонстрацию и пример проекта готов к загрузке) и NuGet .
Будет автоматически устанавливать состояние объектов на Added
или Modified
. И вы вручную выберете, какие объекты должны быть удалены, если они больше не существуют.
Пример:
Допустим, у меня есть Person
объект. Person
может иметь много телефонов, документ и может иметь супруга.
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public int Age { get; set; }
public int DocumentId {get; set;}
public virtual ICollection<Phone> Phones { get; set; }
public virtual Document Document { get; set; }
public virtual PersonSpouse PersonSpouse { get; set; }
}
Я хочу определить состояние всех объектов, включенных в график.
context.InsertOrUpdateGraph(person)
.After(entity =>
{
// Delete missing phones.
entity.HasCollection(p => p.Phones)
.DeleteMissingEntities();
// Delete if spouse is not exist anymore.
entity.HasNavigationalProperty(m => m.PersonSpouse)
.DeleteIfNull();
});
Также, как вы знаете, уникальные свойства ключа могут играть роль при определении состояния объекта Phone. Для таких специальных целей у нас есть класс ExtendedEntityTypeConfiguration<>
, который наследуется от EntityTypeConfiguration<>
. Если мы хотим использовать такие специальные конфигурации, мы должны наследовать наши классы отображения от ExtendedEntityTypeConfiguration<>
, а не EntityTypeConfiguration<>
. Например:
public class PhoneMap: ExtendedEntityTypeConfiguration<Phone>
{
public PhoneMap()
{
// Primary Key
this.HasKey(m => m.Id);
…
// Unique keys
this.HasUniqueKey(m => new { m.Prefix, m.Digits });
}
}
Вот и все.