2009-03-08 41 views
24

Tôi chuyển dữ liệu giữa khung thực thể và lớp doanh nghiệp và lớp người dùng bằng cách sử dụng Đối tượng chuyển dữ liệu. Tôi có một số nghi ngờ, nếu tôi lấy một đối tượng được chuyển đổi thành một DTO, làm cách nào để cập nhật đối tượng chính xác trong khung thực thể chứ không phải chỉ cần chèn một bản sao?Cập nhật đối tượng khung thực thể

Trả lời

2

Bạn cần phải bao gồm khóa chính hoặc khóa thay thế trong DTO, sau đó đối sánh khóa đó lại với thực thể EF chính xác khi cập nhật.

7

một câu hỏi cũ, nhưng chỉ trong trường hợp ai đó cần một giải pháp mã:

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

Ví dụ:

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

Đoạn mã dưới đây sẽ cập nhật một thực thể EF 4 đã được tạo ra như thông số bộ điều khiển trong MVC từ chế độ xem được nhập mạnh mẽ:

Dường như mẹo là sử dụng ObjectStateManager để thay đổi trạng thái f rom Đã thêm vào Đã sửa đổi khi thực thể đã được thêm vào ngữ cảnh.

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

Theo @Sean Mills bình luận nếu bạn đang sử dụng sử dụng EF5:

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

Cuối cùng! Tôi đã lãng phí rất nhiều thời gian với các cách giải quyết khác - điều này làm việc tuyệt vời mà không cần phải làm dbObject.Property = passedObject.Property cho mỗi thuộc tính khi cập nhật. – kape123

+2

nếu ObjectStateManager không phải là thuộc tính của ngữ cảnh của bạn thử ((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(); 
} 
Các vấn đề liên quan