2009-03-08 4 views
24

Я переношу данные между каркасом сущности и бизнес-уровнем и пользовательским уровнем с помощью объектов передачи данных. У меня есть некоторые сомнения, если я получаю объект, который преобразован в DTO, как я могу обновить правильный объект в структуре сущности, а не просто вставить дубликат?Объекты инфраструктуры сущности объекта

ответ

2

Вам необходимо будет включить первичный или альтернативный ключ в DTO, а затем сопоставить этот ключ с правильным EF-объектом после обновления.

7

старый вопрос, но только в том случае, если кто нужен код решение:

http://www.mikesdotnetting.com/Article/110/ASP.NET-MVC-Entity-Framework-Modifying-One-to-Many-and-Many-to-Many-Relationships

Пример:

public void EditArticle(
     Article article, string articleTypeId, string[] categoryId) 
{ 
    var id = 0; 
    Article art = de.ArticleSet 
        .Include("ArticleTypes") 
        .Include("Categories") 
        .Where(a => a.ArticleID == article.ArticleID) 
        .First(); 

    var count = art.Categories.Count; 
    for (var i = 0; i < count; i++) 
    { 
    art.Categories.Remove(art.Categories.ElementAt(i)); 
    count--; 
    } 
    foreach (var c in categoryId) 
    { 
    id = int.Parse(c); 
    Category category = de.CategorySet 
     .Where(ct => ct.CategoryID == id).First(); 
    art.Categories.Add(category); 
    } 

    art.Headline = article.Headline; 
    art.Abstract = article.Abstract; 
    art.Maintext = article.Maintext; 
    art.DateAmended = DateTime.Now; 

    art.ArticleTypesReference.EntityKey = new EntityKey(
              "DotnettingEntities.ArticleTypeSet", 
              "ArticleTypeID", 
              int.Parse(articleTypeId) 
             ); 

    de.SaveChanges(); 
} 
28

Следующий код будет обновлять EF 4 сущность, которая была создана в параметр контроллера в MVC из строго типизированного вида:

Кажется, что использование ObjectStateManager для изменения состояния f rom Добавлен в Модифицированный, как только объект был добавлен в контекст.

MyEntities db = new MyEntities(); 
db.Product.AddObject(product); 
db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified); 
return db.SaveChanges() > 0; 

По @Sean Миллс комментарий, если вы используете использовать Ef5:

((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added); 
+0

Наконец! Я потратил столько времени на другие обходные пути - это работает потрясающе, без необходимости делать dbObject.Property = receivedObject.Property для каждого свойства при обновлении. – kape123

+2

, если ObjectStateManager не является свойством вашего контекста try ((System.Data.Entity.Infrastructure.IObjectContextAdapter) db) .ObjectContext http://stackoverflow.com/a/8968643/678338 –

4
//I am replacing player :) 
public ActionResult ProductEdit(string Id, Product product) 
{ 
    int IdInt = DecyrptParameter(Id); 
    MyEntities db = new MyEntities(); 

    var productToDetach = db.Products.FirstOrDefault(p=> p.Id == IdInt); 
    if (product == null) 
     throw new Exception("Product already deleted"); //I check if exists, maybe additional check if authorised to edit 
    db.Detach(productToDetach); 

    db.AttachTo("Products", product); 
    db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified); 

    db.SaveChanges(); 
    ViewData["Result"] = 1; // successful result 
    return View(); 
} 
Смежные вопросы