2015-09-09 10 views
36

Tôi có đối tượng sau đây trong DbContext tôi:lập bản đồ có điều kiện với graphdiff

enter image description here

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

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

Đôi khi tôi muốn cập nhật a đồ thị:

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

Tôi muốn cập nhật a với Bs của nó (cập nhật C, D, E quá) sử dụng graphdiff:

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

này cập nhật A, B s, C s, D s, nhưng không E s.

Vì vậy, tôi nghĩ, tôi cần phải xác định một ánh xạ có điều kiện cho graphdiff, để cập nhật E quá, somethings như:

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

Có cách nào để làm công việc này?

+0

Trong dbContext bạn đã nói rằng d 'sở hữu' bộ sưu tập Es? một cái gì đó như dbContext.UpdateGraph (d, map => map.OwnedCollection (x => x.Es)); ? –

+0

@PaulZahra: yeah – Masoud

Trả lời

1

Bạn có thể sử dụng điều này với graphdiff:

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

thấy liên kết này: GraphDiff Explanation

0

Tôi không tin rằng có thể sử dụng cấu trúc lớp hiện tại của bạn. Tuy nhiên, tôi đã tìm ra cách để thực hiện việc này, nhưng bạn phải thực hiện một số thay đổi trong mã của mình.

Cập nhật các 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; }  
} 

Cập nhật B, C, và 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>(); 
    } 
} 

Để duy trì chiến lược TPH, một số ánh xạ là cần thiết.

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")); 

Bây giờ, bạn có cấu trúc cơ sở dữ liệu gần như giống nhau. CD vẫn được ánh xạ tới cùng một bảng.

Cuối cùng, cập nhật Graph:

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

Hy vọng nó sẽ giúp!

Các vấn đề liên quan