2010-01-29 34 views
5

Tôi có một số mã MVC để tuần tự hóa đối tượng EF 3.5 thành một loại ẩn danh để trả về dưới dạng kết quả JSON cho cuộc gọi AJAX trên trang của tôi. Rào cản tôi có là khi tôi gửi đối tượng trở lại máy chủ thông qua JSON, (và để cho ModelBinder deserialize nó cho tôi vào loại EF của tôi), tôi phải cập nhật nó trong bối cảnh Entity Framework của mình theo cách thủ công. Hoặc ít nhất đó là những gì tôi đang làm bây giờ. Nó không có EntityKey, vì vậy việc gắn nó không thành công. Tôi cuối cùng phải tìm kiếm các đối tượng cũ và cập nhật tài sản theo tài sản. Bất kỳ ý tưởng xung quanh điều này? Là giải pháp để vượt qua EntityKey xung quanh với đối tượng của tôi?Cách tốt nhất để chuyển đối tượng Entity Framework qua web và quay lại qua JSON

Dưới đây là những gì tôi có:

public void Update(Album album) 
    { 
     using (var db = new BandSitesMasterEntities()) 
     { 
      var albumToUpdate = db.Album.First(x => x.ID == album.ID); 

      albumToUpdate.AlbumTitle = album.AlbumTitle; 
      albumToUpdate.Description = album.Description; 
      albumToUpdate.ReleaseYear = album.ReleaseYear; 
      albumToUpdate.ImageURL = album.ImageURL; 
      albumToUpdate.OtherURL = album.OtherURL; 

      db.SaveChanges(); 
     } 
    } 

Và đây là những gì tôi muốn làm, hoặc một cái gì đó tương tự:

public void Update(Album album) 
    { 
     using (var db = new BandSitesMasterEntities()) 
     { 
      db.Attach(album) 
      db.SaveChanges(); 
     } 
    } 
+0

bạn đang sử dụng EF 4? – ashraf

+0

tại sao bạn không sử dụng dịch vụ dữ liệu? – Nix

+0

@ashraf, ông nói rằng ông đang sử dụng EF 3.5 – StriplingWarrior

Trả lời

0

Bạn có thử một cái gì đó như:

object original; 
var key = contexte..CreateEntityKey("EntitySet", modified); 
if(contexte.TryGetObjectByKey(key, out original)) 
{ 
    var originalEntity = (YourEntityType)original; 
    // You have to mannualy set your entityKey 
    originalEntity.YourEntityReference.EntityKey = new EntityKey("Entities.EntitySet", "Id", modified.YourEntity.Id); 

    contexte.ApplyPropertyChanges("EntitySet", modified); 
} 
contexte.SaveChanges(); 

Giả sử rằng EntityReference của bạn được thiết lập bởi thả xuống, bạn vẫn sẽ có Id

1

hoặc bạn có thể sử dụng để lập bản đồ những AutoMapper cho bạn, vì vậy bạn chỉ cần thêm một dòng phụ vào ví dụ của mình.

+0

2 dòng thực sự - truy xuất khóa và sau đó ánh xạ. –

1

Tại sao không chỉ sử dụng phương pháp điều khiển UpdateModel hoặc TryUpdateModel thay thế? Nó hoạt động thực sự tốt với EF và bạn thậm chí có thể thiết lập một cách rõ ràng danh sách các thuộc tính đi kèm.

Tham số id sẽ tự động ánh xạ qua khung MVC đến trường ẩn trên biểu mẫu của bạn chỉ định id.

public void Update(int id, FormCollection collection) 
{ 
    using (var db = new BandSitesMasterEntities()) 
    { 
     var albumToUpdate = db.Album.First(x => x.ID == id); 

     //use UpdateModel to update object, or even TryUpdateModel 
     UpdateModel(albumToUpdate, new string[] { "AlbumTitle", "Description", "ReleaseYear", "ImageURL", "OtherURL" }); 

     db.SaveChanges(); 
    } 
} 
1

Điều này trở nên dễ dàng hơn cho chúng tôi trong EF 4.0. Đây là những gì chúng tôi đã làm trong EF 3.5:

public static void AttachAsModified(this ObjectContext objectContext, string setName, object entity, 
            IEnumerable<String> modifiedFields) 
{ 
    objectContext.AttachTo(setName, entity); 
    ObjectStateEntry stateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(entity); 
    foreach (String field in modifiedFields) 
    { 
     stateEntry.SetModifiedProperty(field); 
    } 
} 

Và sau đó:

using (var db = new BandSitesMasterEntities()) 
{ 
    db.AttachAsModified("Album", album, new string[] { "AlbumTitle", "Description", "ReleaseYear", "ImageURL", "OtherURL" }) 
    db.SaveChanges(); 
} 

Nó trở nên phức tạp hơn nếu bạn có ràng buộc khoá ngoại, nhưng có vẻ như bạn không.

0

Trong partial class nhân Album của bạn, bạn có thể định nghĩa một hàm CopyFrom và gọi nó là từ chức năng Update của bạn

partial class Album 
{ 
    public void CopyFrom(Album album) 
    { 
    //individual field copying here 
    } 
} 


public void Update(Album album) 
    { 
     ... 
     albumToUpdate.CopyFrom(album); 
     ... 
    } 
Các vấn đề liên quan