Лучший способ передать объект Entity Framework через Интернет и обратно через JSON - PullRequest
5 голосов
/ 30 января 2010

У меня есть некоторый код MVC, который сериализует объект EF 3.5 в анонимный тип для возврата в виде результата JSON при вызове AJAX на моей странице. У меня есть препятствие: когда я отправляю объект обратно на сервер через JSON (и позволяю ModelBinder десериализовать его для меня в мой тип EF), я должен обновить его в контексте Entity Framework вручную, Или, по крайней мере, это то, что я делаю сейчас. У него нет EntityKey, поэтому присоединить его не удается. В конечном итоге мне приходится искать старый объект и обновлять его свойство по свойству. Есть идеи по этому поводу? Является ли решение передать EntityKey с моим объектом?

Вот что у меня есть:

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

Ответы [ 6 ]

1 голос
/ 08 июля 2010

Это стало намного проще для нас в 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();
}

Все становится сложнее, если у вас есть ограничения внешнего ключа, но похоже, что нет.

1 голос
/ 08 июля 2010

Почему бы просто не использовать вместо этого методы контроллера 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 голос
/ 21 мая 2010

или вы можете использовать AutoMapper для сопоставления этих полей для вас, так что вы просто добавите одну дополнительную строку в ваш пример.

0 голосов
/ 15 июля 2010

В частичном классе сущности вашего альбома вы можете определить функцию CopyFrom и вызывать ее из функции обновления

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


 public void Update(Album album) 
    { 
      ...
      albumToUpdate.CopyFrom(album);
      ...
    }
0 голосов
/ 10 апреля 2010

Вы пробовали что-то вроде:

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 установлена ​​dropDown, у вас все равно будет Id

0 голосов
/ 03 апреля 2010

Нет способа обойти ключ сущности. Вы должны либо добавить его в свой анонимный тип, либо я бы порекомендовал вам перенести код на использование служб данных.

http://www.hanselman.com/blog/jQueryToShipWithASPNETMVCAndVisualStudio.aspx

, который позволит вам выполнять все манипуляции с БД на стороне клиента.

http://msdn.microsoft.com/en-us/data/bb931106.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...