Отключенный комплексный график с отключенными дочерними объектами

entity-framework-6 graphdiff

Вопрос

У меня есть сложный граф с дочерними сущностями коллекции. Связь между родительскими и дочерними объектами является отношением «один-много» и имеет независимую ассоциацию. Я знаю, что я не могу сохранить свой график без ручной синхронизации, чего я хочу избежать. Я нашел решение GraphDiff многообещающим, и я начал изучать его, но я не мог достичь того, что намерен, поскольку мой сценарий несколько своеобразен. Эта проблема связана исключительно с GraphDiff, но я также приветствую другие решения.

public class person
{
    public virtual int Id {get; set;} //primary key
    public virtual string Name {get; set;}
    public virtual ICollection<Car> Cars {get; set;}
 }
public class Car
{
    public virtual int PersonId {get; set;} // is a foreign key 
    public virtual Datetime BoughtDate {get; set;}   // this property and above mentioned foreign key together makes a primary key in database

    public virtual DateTime InsuraceStartDate {get; set;}
    public virtual DateTime InsuraceExpiryDate {get; set;}
    public virtual DateTime LastServiceDate {get; set;}
}

В любой момент моей коллекции Person.Cars может быть 1. Новый объект автомобиля. 2. Существующий объект автомобиля с обновленными значениями (страховые или служебные даты).

Id для Person и PersonId on Car будет 0.

    Person _person = GetPersonToAddOrUpDate();
     int id =   _person.id; //id will be 0.

На этом этапе мы не уверены, что объект, который мы получили, должен быть добавлен или обновлен. PersonId для дочерних объектов (Cars) также будет 0. Теперь, если мы позвоним.

     Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars)); 
  throws exception at FindEntityMatching(entity). 

Чтобы преодолеть это, мне нужно обновить свойство Id на личном.

     var dbPersonId  = Context.Single<Person>(x => x.Name == _person.Name).Id;
    _person.id = dbPersonId != null ? dbPersonId : 0;
     Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));

Он удаляет все объекты в dbPerson.Cars и добавляет _person.Cars в dbPerson.Cars и сохраняет. Это означает, что все записи в моей таблице «Автомобили» в базе данных удаляются, а записи из _person.Cars вставлены. Я заметил, что это происходит потому, что теперь дочерние объекты не имеют свойства Id. Я должен установить их вручную.

  foreach(var car in _person.Cars)
        car.PersonId = _person.Id

Теперь, если вы позвоните

   Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));  

Это добавит сущности в коллекции от временного объекта, отсутствующие в постоянном объекте, и обновит совпадение объектов в постоянном объекте и удалит остальную часть объектов из постоянного объекта.

     var dbCars = conext.Where(x => x.Personid == _person.Id).Select(x).ToList();

скажем, dbCars.Count составляет 8 и _person.Cars.Count 3. (один новый автомобиль и 2 старых автомобиля с обновленными значениями) После запуска.

    Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));

2 старых автомобиля от _person.Cars, сопоставимые в dbCars, будут обновлены. 1 новый автомобиль от _person.Карты, не соответствующие в dbCars, будут добавлены.

Теперь количество dbCars должно быть 9, поскольку мы добавили новый автомобиль. Теперь проверьте счет.

  var dbCarCount = conext.Where(x => x.Personid == _person.Id).Select(x).ToList().Count();

dbCarCount будет 3. Остальные 6 автомобилей из dbCars будут удалены.

Мне жаль, что я не прав, поскольку мне нравится использовать ваше решение. Моя работа в этой области застопорилась. Пожалуйста, дайте мне знать Если мне что-то не хватает или вам нужна дополнительная информация. Я знаю, что моя запись путается, когда я пытался использовать весь свой опыт тестирования с помощью GraphDiff. Надеюсь, вы решаете эту проблему.

Популярные ответы

Если у вас есть отключенный график, и вы хотите объединить его с базой данных, то есть 3 вещи, которые он должен сделать:

  1. Вставить новые объекты
  2. Обновление существующих объектов
  3. Удалить объекты не на графике

Кажется, у вас проблема с последней частью.

Если граф не был извлечен из базы данных в первую очередь, вы не используете GraphDiff, как предполагалось. Вам нужно будет вручную добавлять и обновлять.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему