c# - इकाई फ्रेमवर्क में अद्यतन पर संपत्ति को बाहर निकालें




asp.net-mvc entity-framework (3)

नया मॉडल बनाएं जिसमें आपके द्वारा अपडेट किए जाने वाले गुणों का सीमित सेट होगा।

यदि आपका इकाई मॉडल है:

public class User
{
    public int Id {get;set;}
    public string Name {get;set;}
    public bool Enabled {get;set;}
}

आप कस्टम व्यू मॉडल बना सकते हैं जो उपयोगकर्ता को नाम बदलने की अनुमति देगा, लेकिन सक्षम ध्वज नहीं:

public class UserProfileModel
{
   public int Id {get;set;}
   public string Name {get;set;}
}

जब आप डेटाबेस अपडेट करना चाहते हैं, तो आप निम्न कार्य करते हैं:

YourUpdateMethod(UserProfileModel model)
{
    using(YourContext ctx = new YourContext())
    { 
        User user = new User { Id = model.Id } ;   /// stub model, only has Id
        ctx.Users.Attach(user); /// track your stub model
        ctx.Entry(user).CurrentValues.SetValues(model); /// reflection
        ctx.SaveChanges();
    }
}

जब आप इस विधि को कॉल करते हैं, तो आप नाम अपडेट करेंगे, लेकिन सक्षम संपत्ति अपरिवर्तित रहेगी। मैंने सरल मॉडल का इस्तेमाल किया, लेकिन मुझे लगता है कि आपको तस्वीर का उपयोग कैसे किया जाएगा।

मैं एमवीसी में एक मॉडल को अद्यतन करते समय परिवर्तित नहीं होने के लिए एक संपत्ति को चिह्नित करने का एक उचित तरीका ढूंढ रहा हूं।

उदाहरण के लिए, चलिए इस छोटे मॉडल को लेते हैं:

class Model
{
    [Key]
    public Guid Id {get; set;}
    public Guid Token {get; set;}

    //... lots of properties here ...
}

तो संपादन विधि एमवीसी इस तरह दिखता है:

[HttpPost]
public ActionResult Edit(Model model)
{
    if (ModelState.IsValid)
    {
        db.Entry(model).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

अब अगर मेरे व्यू में टोकन नहीं है, तो इसे उस संपादन के माध्यम से हटा दिया जाएगा।

मैं इस तरह कुछ ढूंढ रहा हूँ:

db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).State = PropertyState.Unmodified;
db.SaveChanges();

अब तक का सबसे अच्छा तरीका यह है कि मैं समावेशी होना चाहता हूं और उन सभी गुणों को सेट करना चाहता हूं जिन्हें मैं हाथ से शामिल करना चाहता हूं, लेकिन मैं वास्तव में केवल यह कहना चाहता हूं कि कौन से लोगों को बाहर रखा जाना है।


मुझे लगता है कि आप नहीं चाहते हैं कि संपत्ति कुछ मामलों में बदल दी जाए, क्योंकि यदि आप इसका उपयोग नहीं करेंगे तो कभी भी अपने आवेदन में नहीं, बस इसे अपने मॉडल से हटा दें।

यदि आप इसे कुछ परिदृश्यों में उपयोग करना चाहते हैं और उपर्युक्त मामले में "शून्यकरण" से बचें, तो आप निम्न कोशिश कर सकते हैं:

  • छुपाएं के साथ दृश्य में पैरामीटर छुपाएं:

    @Html.HiddenFor(m => m.Token)

इससे आपका मूल मूल्य असम्बद्ध हो जाएगा और नियंत्रक को वापस भेज दिया जाएगा।

अपने ऑब्जेक्ट को अपने DBSet से नियंत्रक में फिर से लोड करें और इस विधि को चलाएं। आप एक श्वेत सूची और पैरामीटर की एक ब्लैकलिस्ट दोनों निर्दिष्ट कर सकते हैं जो अपडेट या अपडेट नहीं होंगे।


हम इस तरह उपयोग कर सकते हैं

 db.Entry(model).State = EntityState.Modified;
 db.Entry(model).Property(x => x.Token).IsModified = false;
 db.SaveChanges();

यह अद्यतन होगा लेकिन टोकन संपत्ति के बिना







entity-framework