2012-02-20 31 views
8

Tôi đang thực hành với một nhóm các lớp đầu tiên có mối quan hệ cha-con giữa chúng.Sử dụng EF 4.1 Chèn một bản ghi cha và nhiều bản ghi con làm một "Đơn vị công việc"

public class Parent 
{ 
    public int Id (get; set; } 
    public string Name { get; set; } 
    public List<Child> Children { get; set; } 

    public Parent() 
    { 
     Children = new List<Child>(); 
    } 
} 

public class Child() 
{ 
    public int Id (get; set; } 
    public string Name { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Parent> Parents { get; set; } 
    public DbSet<Child> Children { get; set; } 
} 

Trong ứng dụng bảng điều khiển đơn giản Tôi tạo cha mẹ và tạo hai bản ghi con và thêm chúng vào phụ huynh. Nếu sau đó tôi gọi SaveChanges() chỉ đứa trẻ đầu tiên được thêm vào bảng con.

var x = new MyContext(); 

var c1 = new Child { Name = "Alpha-Child" }; 
var c2 = new Child { Name = "Beta-Child" }; 

var p = new Parent {Name = "Alpha-Parent"}; 

p.Children.Add(c1); 
p.Children.Add(c2); 

x.Parents.Add(p); 

x.SaveChanges(); 

Vâng, đó không phải là những gì tôi muốn, vì vậy tôi đã cố gắng để có thể thêm sau đó cho cả đối tượng cha và đối tượng bối cảnh.

var x = new MyContext(); 

var c1 = new Child { Name = "Alpha-Child" }; 
var c2 = new Child { Name = "Beta-Child" }; 

var p = new Parent {Name = "Alpha-Parent"}; 

p.Children.Add(c1); 
p.Children.Add(c2); 

x.Children.Add(c1); 
x.Children.Add(c2); 

x.Parents.Add(p); 

x.SaveChanges(); 

Điều đó có cả bản ghi con vào cơ sở dữ liệu, nhưng chỉ một trong số chúng (bản ghi đầu tiên) được liên kết với hồ sơ gốc.

Cuối cùng, nhưng không kém phần quan trọng, tôi đã cố thực hiện cuộc gọi đến SaveChanges() sau mỗi cuộc gọi đến Parent.Add().

var x = new MyContext(); 

var c1 = new Child { Name = "Alpha-Child" }; 
var c2 = new Child { Name = "Beta-Child" }; 

var p = new Parent {Name = "Alpha-Parent"}; 

x.Parents.Add(p); 

p.Children.Add(c1); 
x.SaveChanges(); 

p.Children.Add(c2); 
x.SaveChanges(); 

Tuy nhiên, điều này làm hỏng ý tưởng của tôi về cách hoạt động của Mô hình "Đơn vị công việc". Tôi "nên có thể gọi SaveChanges() một lần, và có tất cả những thay đổi của tôi diễn ra, đúng không?

Vì vậy, những gì tôi làm sai?

Trả lời

6

Các đoạn mã sau đây sẽ tiết kiệm được những thay đổi đơn tiết kiệm. và luôn luôn sử dụng một TransactionScope để tiết kiệm trong đợt duy nhất.

public class Child 
{ 
    public int Id (get; set; } 
    public string Name { get; set; } 
    public Parent Parent {set;get;} 
} 


var x = new MyContext(); 
var c1 = new Child { Name = "Alpha-Child" }; 
var c2 = new Child { Name = "Beta-Child" }; 

var p = new Parent {Name = "Alpha-Parent"}; 
c1.Parent = p; 
c2.Parent = p; 
x.Parents.Add(p); 
x.SaveChanges(); 
+0

Cảm ơn. Thats không hoạt động. Nhưng, tại sao tôi * CẦN * một liên kết quay lại với phụ huynh? Trong một thế giới thường xuyên của POCO, tôi sẽ không bao giờ tạo ra loại mối quan hệ đó trừ khi yêu cầu kinh doanh cần đến nó. Tôi sẽ luôn luôn bắt đầu đi bộ qua các thực thể của tôi với thực thể cơ bản. Tôi có thiếu một số mẫu mà tôi nên học/lấy trái tim? – saunderl

+0

Không, bạn không cần thêm thuộc tính cho Cha mẹ trong Chind. Parnet.Children tài sản là đủ cho quan hệ một-nhiều. – Ray

+2

Chỉ cần cập nhật: Để làm cho bảng FK gốc trong bảng Trẻ em bắt buộc, tôi cần phải thêm liên kết quay lại phụ huynh từ trẻ và sử dụng chú thích để đánh dấu yêu cầu đó. Nhưng, tôi có thể làm cho tài sản riêng tư để nó được ẩn khỏi người dùng của lớp. – saunderl

2

tôi không biết lý do tại sao bạn kế thừa từ EntityBase kể từ khi bạn nói rằng bạn đang thử nghiệm với POCO mã đầu tiên. Dù sao, tôi được thử nghiệm sau mã với thành công

class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = new MyContext(); 

      var c1 = new Child { Name = "Alpha-Child" }; 
      var c2 = new Child { Name = "Beta-Child" }; 

      var p = new Parent { Name = "Alpha-Parent" }; 

      p.Children.Add(c1); 
      p.Children.Add(c2); 

      x.Parents.Add(p); 

      x.SaveChanges(); 


      Console.Read(); 
     } 
    } 

    public class Parent 
    { 
     public Parent() 
     { 
      Children = new List<Child>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<Child> Children { get; set; } 
    } 

    public class Child 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public DbSet<Parent> Parents { get; set; } 
     public DbSet<Child> Children { get; set; } 
    } 
+0

EntityBase ... một tạo tác cắt và dán. Tôi đã sửa ví dụ của mình. – saunderl

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