2015-09-09 5 views
36

У меня есть следующие объекты в моей DbContext:Условное отображение с graphdiff

enter image description here

public class A 
{ 
    public A() 
    { 
     Bs = new List<B>(); 
    } 

    public ICollection<B> Bs { set; get; } 
} 

Иногда я хочу, чтобы обновить a график:

var a = dbContext.As 
     .AsNoTracking() 
     .Include(x=>x.Bs) 
     .firstOrDefault(); 

var c = new C(); 
a.Bs.Add(c); 

var d = new D(); 
var e1 = new E(); 
var e2 = new E(); 
d.Es.Add(e1); //<-- added new E 
d.Es.Add(e2); //<-- added new E 

a.Bs.Add(d); 

Я хочу обновить a с его Bs (обновление C, D, E тоже) с помощью graphdiff:

dbContext.UpdateGraph(a,map=>map.OwnedCollection(x=>x.Bs)); 

Это обновляет A, B s, C с, D с, но не E сек.

Так что я думаю, мне нужно определить условное отображение для graphdiff, чтобы обновить E слишком, нечто вроде:

dbContext.UpdateGraph(a,map=>map.OwnedCollection(x=>x.Bs.OfType<D>(), 
              with =>with.OwnedCollection(t=>t.Es)) 
           .OwnedCollection(x=>x.Bs.OfType<C>())); 

Есть ли способ, чтобы сделать эту работу?

+0

В dbContext вы заявили, что d 'владеет' коллекцией Es? что-то вроде dbContext.UpdateGraph (d, map => map.OwnedCollection (x => x.Es)); ? –

+0

@PaulZahra: да – Masoud

ответ

1

Вы можете использовать это с graphdiff:

dbContext.UpdateGraph(a, map => map 
    .OwnedCollection(b => p.Bs, with => with 
    .AssociatedCollection(p => p.Es))); 

смотрите по этой ссылке: GraphDiff Explanation

0

Я не верю, что это возможно с помощью текущей структуры класса. Однако я нашел способ сделать это, но вы должны внести некоторые изменения в свой код.

Обновление A:

public class A 
{ 
    public A() 
    { 
     Cs = new List<C>(); 
     Ds = new List<D>(); 
    } 

    //PK 
    public int AId { get; set; } 

    public ICollection<C> Cs { set; get; } 
    public ICollection<D> Ds { set; get; }  
} 

Update B, C и D:

public class B 
{ 
    public int BId { get; set; } 
} 

public class C : B 
{ 
    //FK that links C to A 
    public int FK_C_AId { get; set; } 
} 

public class D : B 
{ 
    //FK that links D to A 
    public int FK_D_AId { get; set; } 

    public ICollection<E> Es { get; set; } 

    public D() 
    { 
     Es = new List<E>(); 
    } 
} 

Для того, чтобы поддерживать стратегию Тф, некоторые отображения необходимы.

modelBuilder.Entity<A>() 
    .HasMany(i => i.Cs) 
    .WithRequired() 
    .HasForeignKey(i => i.FK_C_AId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<A>() 
    .HasMany(i => i.Ds) 
    .WithRequired() 
    .HasForeignKey(i => i.FK_D_AId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<B>() 
    .Map<C>(m => m.Requires("Discriminator").HasValue("C")) 
    .Map<D>(m => m.Requires("Discriminator").HasValue("D")); 

Теперь у вас почти такая же структура базы данных. C и D по-прежнему отображаются в одну и ту же таблицу.

Наконец, обновите график:

context.UpdateGraph(a, map => map 
    .OwnedCollection(b => b.Cs) 
    .OwnedCollection(b => b.Ds, with => with 
     .AssociatedCollection(e => e.Es))); 

Надеется, что это помогает!

 Смежные вопросы

  • Нет связанных вопросов^_^