2013-07-24 38 views
10

Tôi hiện có một mô hình có dữ liệu hiện có cũng như dữ liệu mới.cách lưu mô hình có dữ liệu hiện có cũng như dữ liệu mới?

Là một ví dụ này là mô hình của tôi

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

    } 

Đây là dữ liệu giả rằng nó hiện đang có

List<NameDetails> Names = new List<NameDetails>{ 

       new NameDetails{Id = 1, Name = "Name 1"}, 
       new NameDetails{Id = 2 , Name = "Name 2"}, 
      }; 

Bây giờ giả sử tôi cần phải tiết kiệm này vào một cơ sở dữ liệu .. Tôi đã có id = 1 trong bảng, do đó, đó phải là một bản cập nhật mà như id = 2 nên là một add ... làm thế nào tôi có thể làm điều đó?

Trước đây khi tôi đã viết tiết kiệm sử dụng một kho lưu trữ tôi đã làm một trong hai một add hoặc chỉnh sửa Thêm như vậy,

context.NameDetails.Add(NameDetails); 
    context.SaveChanges(); 

hoặc Sửa như vậy,

var recordToUpdate = context.NameDetails.FirstOrDefault(x => x.Id== 1); 
recordToUpdate.Name = "New name"; 
context.SaveChanges(); 

nên đó có nghĩa là Tôi phải lặp lại danh sách của mình và tìm ra cái gì mới và cái gì không phải .. hoặc có cách nào khác không?

+1

Bạn chỉ có 2 tùy chọn: - Truy vấn cơ sở dữ liệu để tìm hiểu xem đối tượng đã tồn tại chưa. Hoặc - Để đối tượng giữ một số thuộc tính để xác định xem nó có mới hay không (ví dụ Id = 0) – Reda

+2

Không chắc chắn nó có thực sự phù hợp hay không, nhưng bạn lấy giá trị Id từ 2 cho bản ghi mới ở đâu? –

+0

@ user2266486 Hoặc thực hiện một thủ tục được lưu trữ để thực hiện một upsert, nhưng tôi tự hỏi nếu không có nhiều câu hỏi/vấn đề này –

Trả lời

0

Hãy thử điều này:

var nameIds = Names.Select(n => n.Id); 

var recordsToUpdate = context.NameDetails.Where(x => nameIds.Contains(x.Id)); 
0

Entity Framework không thực hiện rất tốt trong những loại tình huống. Điều này sẽ giúp bạn có được gần với những gì bạn đang tìm kiếm:

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

List<NameDetails> Names = new List<NameDetails> 
    { 
     new NameDetails{Id = 1, Name = "Name 1"}, 
     new NameDetails{Id = 2 , Name = "Name 2"}, 
    }; 


var toFetch = Names.Select(n => n.Id).ToArray(); 
var association = context.NameDetails 
         .Where(n => toFetch.Contains(n.Id)) 
         .ToDictionary(n => n.Id); 

foreach(var name in Names) 
{ 
    NameDetails existing; 
    if(association.TryGetValue(name.Id, out existing)) 
    { 
     // It exists, map the properties in name to existing 
    } 
    else 
    { 
     // It's new, perform some logic and add it to the context 
     context.NameDetails.Add(name); 
    } 
} 

context.SaveChanges() 

Ngoài ra, bạn có thể thử để cướp Entity Framework Migration của AddOrUpdate rằng thực hiện một upsert:

// You need a namespace import of System.Data.Entity.Migrations 
context.NameDetails.AddOrUpdate(names.ToArray()); 
context.SaveChanges(); 

tôi đã không cố gắng này, nhưng nó sẽ làm việc, trừ khi có một logic bổ sung trong các AddOrUpdate mà eludes tôi.

+0

Tôi đã xem xét nhanh việc triển khai AddOrUpdate và - mặc dù cách nó xây dựng các biểu thức là một chút bướng bỉnh - không giống như nó tạo ra bất kỳ câu lệnh SQL kỳ diệu nào. Tôi khá chắc chắn nó làm cho một truy vấn để cố gắng để có được các thực thể bạn vượt qua và cập nhật các thực thể nếu nó tìm thấy nó hoặc thêm nó nếu không có thực thể như vậy. Đó là tốt đẹp khi bạn đang gieo một DB và tất cả mọi thứ trong bộ nhớ đã có, có thể không tốt đẹp như vậy khi bạn đang bất ngờ phát hành một bó toàn bộ TOP (1) truy vấn DB của bạn. –

2

Bạn có thể sử dụng một số quy ước hoạt động tốt với Khung thực thể.

Ví dụ, nếu bạn sử dụng IDENTITY(1,1) trên cơ sở dữ liệu của bạn (vì vậy nó tạo ID cho các hàng chèn của bạn tự động), bất động sản tổ chức của bạn nên sử dụng StoreGeneratedPattern bộ như Identity (trường hợp của phương pháp đầu tiên Model), và Id tài sản của bạn với một 0 giá trị có nghĩa là nó chưa được thêm vào cơ sở dữ liệu.

Sau đó, bạn có thể dễ dàng quyết định nội dung cần thêm và nội dung cần cập nhật. Dưới đây là một số giả (chưa được kiểm tra) mã:

foreach (var entity in entities) 
{ 
    if (entity.Id == 0) 
    { 
     // Adds to the context for a DB insert 
     context.Entities.Add(entity); 
    } 
    else 
    { 
     // Updates existing entity (property by property in this example, you could update 
     // all properties in a single shot if you want) 
     var dbEntity = context.Entities.Single(z => z.Id == entity.Id); 
     dbEntity.Prop1 = entity.Prop1; 
     // etc... 
    } 
} 

context.SaveChanges(); 
1

EF5 + chỉ:

Nếu bạn có một cách để phát hiện hay không một mục mới (Id == 0 là tốt, như trong câu trả lời ken2k của) bạn có thể thực hiện việc này để tránh phải lập bản đồ mọi thứ:

foreach(var entity in entities) 
{ 
    context.NameDetails.Attach(entity); 
    context.Entry(entity).State = IsNewEntity(entity) 
            ? EntityState.Added 
            : EntityState.Modified; 
} 

Điều này sẽ cho EntityFramework tạo INSERT cho các thực thể mới và CẬP NHẬT cho các thực thể cũ.

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