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

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.

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;}
}

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

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;}
}

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

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;}
}

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

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;}
}

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

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;}
}

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

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;}
}

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

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;}
}

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

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

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;}
}

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

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

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

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

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

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

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




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