2015-03-02 12 views
5

Tôi đang sử dụng EF với mã đầu tiên và tôi có các mô hình như thế này:Chèn một thực thể mới mà không cần tạo các đối tượng trẻ nếu chúng tồn tại

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public Customer() 
    { 
     Products = new List<Product>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 

    // more stuff snipped... 

    public ICollection<Product> Products{ get; set; } 
} 

Tôi nhận được một ID của khách hàng cùng với một danh sách các ID sản phẩm . Khi sản phẩm không tồn tại trong DB, tôi muốn thêm nó:

var newProduct = new Product{ Id = id, Name = "<no name yet>", Customer = customer }; 
    InsertProduct(newProduct); 

Vấn đề là EF cố gắng để thác những thay đổi và cố gắng để chèn một đối tượng mới Customer, với cùng một ID như một hiện một, do đó, nó không thành công. Tôi giải quyết điều này như thế nào?

Đây là phương pháp chèn:

public void InsertProduct(Product item) 
    { 
     CustomerContext.Entry(item).State = EntityState.Added; 
     CustomerContext.Set<Product>().Add(item); 
    } 

Trả lời

1

Taken từ here.

Khi thêm một thực thể mới mà đã tồn tại đối tượng trẻ em (đối tượng tồn tại trong cơ sở dữ liệu), nếu các đối tượng trẻ em không được theo dõi bởi EF, các đối tượng con sẽ được chèn lại. Trừ khi bạn đính kèm thủ công đối tượng con đầu tiên.

Hãy thử một cái gì đó như sau để thiết lập các con đối tượng nhà nước:

public void InsertProduct(Product item) 
{ 
    // Calling this code before the context is aware of the Child 
    // objects will cause the context to attach the Child objects to the  
    // context and then set the state. 
    // CustomerContext.Entry(childitem).State = EntityState.Unchanged 
    CustomerContext.Entry(item.ChildObject).State = EntityState.Modified; 

    CustomerContext.Entry(item).State = EntityState.Added; 
    CustomerContext.Set<Product>().Add(item); 
} 
0

Nó là dễ dàng hơn nếu bạn thêm một khóa ngoại đến các tầng lớp phụ huynh:

public class Product 
{ 
    .... 

    public int CustomerId { get; set; } 

    public Customer Customer { get; set; } 
} 

Sau đó, khi bạn muốn chèn, thiết lập phím nước ngoài thay vì của thuộc tính điều hướng:

var newProduct = new Product 
     { 
      Id = id, 
      Name = "<no name yet>", 
      CustomerId = customer.Id 
     }; 
    InsertProduct(newProduct); 

Tham chiếu:

Why does Entity Framework Reinsert Existing Objects into My Database?

Making Do with Absent Foreign Keys

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