2009-03-08 20 views
24

मैं डेटा ट्रांसफर ऑब्जेक्ट्स का उपयोग करके इकाई ढांचे और व्यापार परत और उपयोगकर्ता परत के बीच डेटा स्थानांतरित करता हूं। मुझे कुछ संदेह है, अगर मैं किसी ऑब्जेक्ट को पुनर्प्राप्त करता हूं जो डीटीओ में परिवर्तित होता है, तो मैं इकाई ढांचे में सही ऑब्जेक्ट को कैसे अपडेट करूं और न केवल डुप्लिकेट डालें?अद्यतन इकाई ढांचे ऑब्जेक्ट्स

उत्तर

2

आपको डीटीओ में प्राथमिक या वैकल्पिक कुंजी शामिल करने की आवश्यकता होगी, फिर उस कुंजी को अपडेट पर सही ईएफ इकाई से मेल करें।

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

निम्न कोड एक एफई 4 इकाई है कि के रूप में बनाया गया है अद्यतन करेगा दृढ़ता से टाइप किए गए दृश्य से एमवीसी में एक नियंत्रक पैरामीटर:

ऐसा लगता है कि ऑब्जेक्टस्टेट मैनेजर का उपयोग राज्य f को बदलने के लिए है एक बार संदर्भ में इकाई जोड़ा गया है जब रोम संशोधित करने के लिए जोड़ा गया।

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

अंत में! मैंने अन्य कामकाज के साथ इतना समय बर्बाद कर दिया है - यह डीबीओब्जेक्ट करने की आवश्यकता के बिना कमाल काम करता है। प्रॉपर्टी = पास ऑब्जेक्ट। अद्यतन करते समय प्रत्येक संपत्ति के लिए प्रॉपर्टी। – kape123

+2

यदि ऑब्जेक्टस्टेट प्रबंधक आपके संदर्भ की प्रॉपर्टी नहीं है ((System.Data.Entity.Infrastructure.IObjectContextAdapter) डीबी)। ऑब्जेक्ट कॉन्टेक्स्ट 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(); 
} 
संबंधित मुद्दे