2010-01-29 54 views
5

我有一些MVC代码将EF 3.5对象序列化为匿名类型,作为JSON结果返回给我的页面上的AJAX调用。我遇到的障碍是,当我通过JSON将对象发送回服务器(并且让ModelBinder将其反序列化为我的EF类型)时,我必须在我的实体框架上下文中手动更新它,手动。或者至少这就是我现在正在做的。它没有EntityKey,因此连接失败。我最终不得不查找旧对象并按属性更新它的属性。任何想法呢?解决方案是使用我的对象传递EntityKey吗?通过JSON传输实体框架对象的最佳方式

这是我有:

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

这里就是我想要做的或类似的东西是什么

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

您使用EF 4从更新的功能调用它呢? – ashraf 2010-01-30 00:50:18

+0

你为什么不使用数据服务? – Nix 2010-04-02 20:55:55

+0

@ashraf,他说他使用EF 3.5 – StriplingWarrior 2010-07-07 20:23:08

回答

0

你尝试类似:

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

假设你的EntityReference通过下拉菜单设置,你仍然有标识

1

,或者您可以使用AutoMapper映射那些字段给你,所以你只需在你的例子中添加一行。

+0

2行实际上 - 检索关键字,然后映射。 – 2010-05-21 17:48:57

1

为什么不直接使用UpdateModel或TryUpdateModel控制器方法呢?它与EF的效果非常好,你甚至可以明确地设置包含的属性列表。

id参数将通过MVC框架自动映射到指定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

这对我们来说在EF 4.0中变得容易得多。这是我们在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); 
    } 
} 

然后:

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

,如果你有外键约束,它变得更加复杂,但它看起来像你不知道。

0

在你的相册,实体的部分类,你可以定义的copyfrom功能和

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


public void Update(Album album) 
    { 
     ... 
     albumToUpdate.CopyFrom(album); 
     ... 
    }