Как да актуализирате свързани обекти с помощта на GraphDiff?

Имам следния модел:

public class Customer
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int AddressId {get; set;}
    public virtual Address Address {get; set;}
    public virtual ICollection<CustomerCategory> Categories {get; set;}
}

public class CustomerCategory
{
    public int Id {get; set;}
    public int CustomerId {get; set;}
    public int CategoryId {get; set;}
    public virtual Category Category {get; set;}
}

public class Address
{
    public int Id {get; set;}
    public string Street{get; set;}
    public virtual PostCode PostCode {get; set;}
}

От горното и с помощта на GraphDiff искам да актуализирам агрегата на клиентите, както следва:

dbContext.UpdateGraph<Customer>(entity, 
            map => map.AssociatedEntity(x => x.Address)
                      .OwnedCollection(x => x.Categories, with => with.AssociatedEntity(x => x.Category)));

Но горното не актуализира нищо!!

Какъв е правилният начин за използване на GraphDiff в този случай?


person Ivan-Mark Debono    schedule 05.02.2015    source източник
comment
Можете също да използвате EntityGraphOperations библиотека. Използва се много лесно. И автоматично дефинира състоянията на всички обекти и използва свободен синтаксис.   -  person Farhad Jabiyev    schedule 14.09.2016


Отговори (1)


GraphDiff основно разграничава два вида отношения: собствени и асоциирани.

Притежавано може да се тълкува като "част от", което означава, че всичко, което е собственост, ще бъде вмъкнато/актуализирано/изтрито със своя собственик.

Другият вид релация, обработвана от GraphDiff, е асоциирана, което означава, че само релациите към, но не и самите асоциирани обекти, се променят от GraphDiff при актуализиране на графика.

Когато използвате метода AssociatedEntity, състоянието на дъщерния обект не е част от агрегата, с други думи, промените, които сте направили върху дъщерния обект, няма да бъдат запазени, а само ще се актуализират родителското свойство за навигация.

Използвайте метода OwnedEntity, ако искате да запазите промените върху дъщерния обект, така че ви предлагам да опитате това:

dbContext.UpdateGraph<Customer>(entity,  map => map.OwnedEntity(x => x.Address)
                                                   .OwnedCollection(x => x.Categories, with => with.OwnedEntity(x => x.Category)));
dbContext.SaveChanges();
person octavioccl    schedule 05.02.2015
comment
бихте ли ми казали за използването на AssociatedCollection и AssociatedEntity с проба? - person Amir; 14.05.2019