সত্তা ফ্রেমওয়ার্ক 6 ব্যবহার করে রেকর্ড কীভাবে আপডেট করবেন?


245

আমি EF6 ব্যবহার করে রেকর্ড আপডেট করার চেষ্টা করছি। প্রথমে রেকর্ডটি সন্ধান করুন, উপস্থিত থাকলে তা আপডেট করুন। আমার কোডটি এখানে:

var book = new Model.Book
{
    BookNumber =  _book.BookNumber,
    BookName = _book.BookName,
    BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
    var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
    if (result != null)
    {
        try
        {
            db.Books.Attach(book);
            db.Entry(book).State = EntityState.Modified;
            db.SaveChanges();
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

যতবারই আমি উপরের কোডটি ব্যবহার করে রেকর্ড আপডেট করার চেষ্টা করি, আমি এই ত্রুটিটি পেয়ে যাচ্ছি: -

। System.Data.Entity.Inf संरचना.DbUpdateConcurrencyException: স্টোর আপডেট, সন্নিবেশ, বা বিবৃতি মুছে ফেলা অপ্রত্যাশিত সংখ্যক সারিগুলিকে প্রভাবিত করেছে (0)। সত্তা লোড হওয়ার পরে সত্তাগুলি সংশোধন বা মুছে ফেলা হতে পারে। রিফ্রেশ করুন অবজেক্টস্টেটম্যানেজার এন্ট্রি


7
পার্শ্ব নোট: catch (Exception ex){throw;}অপ্রয়োজনীয় এবং আপনি এটি সম্পূর্ণরূপে অপসারণ করতে পারেন।
শ্রীরাম সাখাটিভেল

ক্যাপ ব্লকটি ব্যর্থতার কারণ খুঁজে বের করার জন্যই। তবে এখনও এটি পেলেন না কেন এই কোডটি ব্যর্থ হচ্ছে?
ব্যবহারকারী 1327064

2
আমি এই বিষয়ে বিশেষজ্ঞ নই, আমি এই প্রশ্নের উত্তর দিতে পারি না। তবে ক্যাপচার চেষ্টা না করে আপনি বিরতি ব্যবহার করতে পারেন যখন কোনও ব্যতিক্রম থাকে তখন ডিবাগারটি ভাঙ্গার জন্য বৈশিষ্ট্য নিক্ষেপ করা হয়।
শ্রীরাম সাক্তিভেল

1
আপনি কিছু পরিবর্তন করেন নি। সত্তা অবস্থার সাথে খেললে বস্তুটি আসলে সংশোধন করা হয়নি এমনটি পরিবর্তন করে না।
জোনাথন অ্যালেন

1
ঠিক আছে, আমি আপনার মতোই করেছি এবং ত্রুটিটি পাই নি। ব্যতিক্রমটি DbUpdateConcurrencyException বলে। আপনি কীভাবে সামঞ্জস্য পরিচালনা করেছেন? আপনি কি টাইমস্ট্যাম্প ব্যবহার করেছেন, আপনি কি ক্লোন করে আবার বস্তুগুলিকে আবার মার্জ করেছেন বা আপনি স্ব-ট্র্যাকিং সত্তাগুলি ব্যবহার করেছেন? (3 সবচেয়ে ব্যবহৃত পন্থা)। আপনি যদি চুক্তিটি পরিচালনা না করেন তবে আমার ধারণা এটি সমস্যা।
এল ম্যাক

উত্তর:


344

আপনি রেকর্ডটি আপডেট করার চেষ্টা করছেন (যার অর্থ আমার কাছে "বিদ্যমান রেকর্ডে একটি মান পরিবর্তন করুন এবং এটি আবার সংরক্ষণ করুন")। সুতরাং আপনাকে অবজেক্টটি পুনরুদ্ধার করতে হবে, পরিবর্তন করতে হবে এবং এটি সংরক্ষণ করতে হবে।

using (var db = new MyContextDB())
{
    var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
    if (result != null)
    {
        result.SomeValue = "Some new value";
        db.SaveChanges();
    }
}

16
মান নির্ধারণের ফলে ডাটাবেস আপডেট হয় না, db.SaveChanges()প্রসঙ্গে পরিবর্তিত বস্তুর সাথে কল করে ডাটাবেস আপডেট হয়।
ক্রেগ ডাব্লু।

6
তবুও এটি আমাকে মুগ্ধ করে ... সুতরাং ফলস্বরূপ, আসলে dbcontext এর সাথে সংযুক্ত হয়ে যায় ... সুতরাং এর অর্থ এটি যে কোনও ভেরিয়েবল যা কোনও dbcontext সদস্য দ্বারা তাত্ক্ষণিকভাবে প্রয়োগ করা হয় তা সেই ডাটাবেসের সাথে সংযুক্ত থাকে যাতে যে পরিবর্তনগুলি সেই ভেরিয়েবলের সাথে প্রয়োগ করা হয় , এটিও প্রয়োগ করা হয় বা স্থির থাকে?
চানট

6
কারণ প্রসঙ্গটি বস্তুটি উত্পন্ন করেছে প্রসঙ্গটি বস্তুটির পরিবর্তনগুলি সহ অবজেক্টটিকে ট্র্যাক করতে পারে। আপনি যখন SaveChangesপ্রসঙ্গটি কল করেন তখন এটি যুক্ত করা, পরিবর্তন করা, বা মোছা এবং সংযুক্ত ডাটাবেসে উপযুক্ত এসকিউএল সরবরাহ করে কিনা তা নির্ধারণের জন্য এটি যে সমস্ত অবজেক্টকে ট্র্যাক করছে তা মূল্যায়ন করে।
ক্রেগ ডাব্লু।

3
আইএম একই সমস্যার মুখোমুখি হচ্ছে - EF6 ব্যবহার করে একটি সত্তা আপডেট করার চেষ্টা করছে। সংযুক্ত করুন + সত্তা স্টেট.মডিফায়েড কাজ করছে না। কেবলমাত্র কাজটি হ'ল - আপনাকে অবজেক্টটি পুনরুদ্ধার করতে হবে, পছন্দসই পরিবর্তন করতে হবে এবং এটি db.SaveChanges () এর মাধ্যমে সংরক্ষণ করতে হবে;
গুরুপ্রীত সিং

7
আপনাকে অবজেক্টটি আপডেট করার জন্য প্রথমে এটি পুনরুদ্ধার করতে হবে না। যতক্ষণ না বুঝেছি আমি প্রাথমিক কী মানগুলির একটি (সম্মিলিত কী) পরিবর্তন করার চেষ্টা করছি ততক্ষণ আমার একই সমস্যা ছিল। যতক্ষণ আপনি একটি সঠিক প্রাথমিক কী সরবরাহ করবেন, আপনি টেবিলে সংজ্ঞায়িত অন্য কোনও সততার সীমাবদ্ধতা ভঙ্গ না করে আপনি সত্ত্বা স্টেটকে পরিবর্তিত এবং সেভচেনজেসগুলিতে সেট করতে পারেন () কাজ করবে।
অ্যাড্রিয়ানজ

165

আমি সত্তা ফ্রেমওয়ার্কের সোর্স কোডটি পর্যালোচনা করেছি এবং আপনি কী সম্পত্তিটি জানেন তা আসলে একটি সত্তা আপডেট করার উপায় খুঁজে পেয়েছি:

public void Update<T>(T item) where T: Entity
{
    // assume Entity base class have an Id property for all items
    var entity = _collection.Find(item.Id);
    if (entity == null)
    {
        return;
    }

    _context.Entry(entity).CurrentValues.SetValues(item);
}

অন্যথায়, ধারণাগুলির জন্য AddOrUpdate বাস্তবায়ন পরীক্ষা করুন ।

এই সাহায্য আশা করি!


12
নিস! সমস্ত বৈশিষ্ট্য গণনা করার দরকার নেই। আমি ধরে নিচ্ছি SaveChanges()মান নির্ধারণের পরে কলটি প্রয়োজনীয়।
জান জহ্রাডনক

3
হ্যাঁ, SaveChanges ()
মিগুয়েল

1
দুর্দান্ত উত্তর, এটি ইন্টেলিজেন্সের সাথে খুব বেশি পরিষ্কার ছিল না যে এরকম কিছু করা কার্যকর হবে না: _context.MyObj = newObj; তারপরে SaveChanges () বা .... _context.MyObj.Update (newObj) তারপরে SaveChanges (); আপনার সমাধান সমস্ত বৈশিষ্ট্য লুপ না করে পুরো অবজেক্টকে আপডেট করে।
আদম

7
এটি আমার কাছে অভিযোগ করে যে আমি আইডি ক্ষেত্রটি সম্পাদনা করার চেষ্টা করছি
ভ্যাসিলি হল

3
@ ভ্যাসিলিহাল - আইডি ক্ষেত্রগুলি (বা আপনি যেটি প্রাথমিক কী হিসাবে সংজ্ঞায়িত করেছেন) মডেলগুলির মধ্যে (মডেলগুলির মধ্যে একটিতে নাল / 0 সহ) পৃথক হলে এটি ঘটে। আইডি দুটি মডেলের মধ্যে মেলে তা নিশ্চিত করুন এবং এটি ঠিকঠাক আপডেট হবে।
গ্যাভিন কোটস

51

আপনি AddOrUpdateপদ্ধতিটি ব্যবহার করতে পারেন :

db.Books.AddOrUpdate(book); //requires using System.Data.Entity.Migrations;
db.SaveChanges();

1
আইএমও সেরা সমাধান
নরগুল

112
.AddOrUpdate()ডাটাবেস মাইগ্রেশনের সময় ব্যবহৃত হয়, মাইগ্রেশনের বাইরে এই পদ্ধতিটি ব্যবহার করতে অত্যন্ত নিরুৎসাহিত করা হয়, সুতরাং এটি কেন Entity.Migrationsনামস্থানে রয়েছে।
অ্যাডাম ভিনসেন্ট

1
@ অ্যাডামভিঞ্জেন্ট যেমন বলেছিলেন, AddOrUpdate()পদ্ধতিটি হ'ল স্থানান্তরকরণের জন্য পরিকল্পনা করা হয়েছে এবং যখন আপনার কেবল বিদ্যমান সারিটি আপডেট করার প্রয়োজন হয় তখন এটি পরিস্থিতির পক্ষে উপযুক্ত নয়। যদি আপনার কাছে অনুসন্ধানের রেফারেন্সের (যেমন আইডি) বই না থাকে তবে এটি নতুন সারি তৈরি করবে এবং এটি আসার ক্ষেত্রে সমস্যা হতে পারে (উদাহরণস্বরূপ, আপনার এমন একটি এপিআই রয়েছে যা আপনাকে 404-নটফাউন্ড প্রতিক্রিয়া ফিরিয়ে নিতে হবে যদি আপনি অ-বিদ্যমান সারিটির জন্য PUT পদ্ধতিতে কল করার চেষ্টা করুন)।
মার্কো

4
আপনি যা করছেন তা যদি না জানেন তবে আপনি এটি ব্যবহার করবেন না !!!!!!!!!!!!!!!! পড়ুন: michaelgmccarthy.com/2016/08/24/…
যুশা

4
আমি আজ আবার এটিতে ফিরে এসেছি, আমি কি আপনাকে কেবলমাত্র সবাইকে সতর্ক করতে পারি যে পছন্দসই ব্যবহারের ক্ষেত্রে এটি ভাল সমাধান নয়
Yusha

23

সুতরাং আপনার কাছে এমন একটি সত্তা রয়েছে যা আপডেট হয়েছে এবং আপনি সর্বনিম্ন কোডের সাথে এটি ডাটাবেসে আপডেট করতে চান ...

সংমেয় সর্বদা কৌতুকপূর্ণ, তবে আমি ধরে নিচ্ছি যে আপনি কেবল আপনার আপডেটগুলি জিততে চান। আমি এখানে আমার একই মামলার জন্য এটি করেছি এবং আপনার ক্লাসগুলি অনুকরণ করতে নামগুলি সংশোধন করেছি। অন্য কথায়, কেবল পরিবর্তন attachকরুন addএবং এটি আমার পক্ষে কাজ করে:

public static void SaveBook(Model.Book myBook)
{
    using (var ctx = new BookDBContext())
    {
        ctx.Books.Add(myBook);
        ctx.Entry(myBook).State = System.Data.Entity.EntityState.Modified;
        ctx.SaveChanges();
    }
}

10

আপনি যদি নিজের অবজেক্টের সমস্ত ক্ষেত্র আপডেট করতে চান তবে আপনার এন্ট্রি () পদ্ধতিটি ব্যবহার করা উচিত। এছাড়াও মনে রাখবেন আপনি ফিল্ড আইডি (কী) পরিবর্তন করতে পারবেন না তাই আপনার সম্পাদনার মতো প্রথমে আইডিকে সেট করুন।

using(var context = new ...())
{
    var EditedObj = context
        .Obj
        .Where(x => x. ....)
        .First();

    NewObj.Id = EditedObj.Id; //This is important when we first create an object (NewObj), in which the default Id = 0. We can not change an existing key.

    context.Entry(EditedObj).CurrentValues.SetValues(NewObj);

    context.SaveChanges();
}

2
আপনার কমপক্ষে প্রশ্নের উত্তর দেওয়ার চেষ্টা করা উচিত, কেবল কোডটি পোস্ট করা উচিত নয়
স্ট্যাসিগার্ল

প্রশ্নকারীকে আরও ভালভাবে সহায়তা করতে দয়া করে কোনও কোড স্নিপেট না রেখে প্রশ্নের কিছু ব্যাখ্যা করুন।
feanor07

9

এই রেকর্ডটি প্রথমে রেকর্ডটি ফেরত দেওয়ার জন্য কোনও কোয়েরি না করে শুধুমাত্র কলামগুলির একটি সেট আপডেট করার পরীক্ষার ফলাফল। এটি প্রথমে সত্ত্বা ফ্রেমওয়ার্ক 7 কোড ব্যবহার করে।

// This function receives an object type that can be a view model or an anonymous 
// object with the properties you want to change. 
// This is part of a repository for a Contacts object.

public int Update(object entity)
{
    var entityProperties =  entity.GetType().GetProperties();   
    Contacts con = ToType(entity, typeof(Contacts)) as Contacts;

    if (con != null)
    {
        _context.Entry(con).State = EntityState.Modified;
        _context.Contacts.Attach(con);

        foreach (var ep in entityProperties)
        {
            // If the property is named Id, don't add it in the update. 
            // It can be refactored to look in the annotations for a key 
            // or any part named Id.

            if(ep.Name != "Id")
                _context.Entry(con).Property(ep.Name).IsModified = true;
        }
    }

    return _context.SaveChanges();
}

public static object ToType<T>(object obj, T type)
{
    // Create an instance of T type object
    object tmp = Activator.CreateInstance(Type.GetType(type.ToString()));

    // Loop through the properties of the object you want to convert
    foreach (PropertyInfo pi in obj.GetType().GetProperties())
    {
        try
        {
            // Get the value of the property and try to assign it to the property of T type object
            tmp.GetType().GetProperty(pi.Name).SetValue(tmp, pi.GetValue(obj, null), null);
        }
        catch (Exception ex)
        {
            // Logging.Log.Error(ex);
        }
    }
    // Return the T type object:         
    return tmp;
}

এখানে সম্পূর্ণ কোড:

public interface IContactRepository
{
    IEnumerable<Contacts> GetAllContats();
    IEnumerable<Contacts> GetAllContactsWithAddress();
    int Update(object c);
}

public class ContactRepository : IContactRepository
{
    private ContactContext _context;

    public ContactRepository(ContactContext context)
    {
        _context = context;
    }

    public IEnumerable<Contacts> GetAllContats()
    {
        return _context.Contacts.OrderBy(c => c.FirstName).ToList();
    }

    public IEnumerable<Contacts> GetAllContactsWithAddress()
    {
        return _context.Contacts
            .Include(c => c.Address)
            .OrderBy(c => c.FirstName).ToList();
    }   

    //TODO Change properties to lambda expression
    public int Update(object entity)
    {
        var entityProperties = entity.GetType().GetProperties();

        Contacts con = ToType(entity, typeof(Contacts)) as Contacts;

        if (con != null)
        {
            _context.Entry(con).State = EntityState.Modified;
            _context.Contacts.Attach(con);

            foreach (var ep in entityProperties)
            {
                if(ep.Name != "Id")
                    _context.Entry(con).Property(ep.Name).IsModified = true;
            }
        }

        return _context.SaveChanges();
    }

    public static object ToType<T>(object obj, T type)
    {
        // Create an instance of T type object
        object tmp = Activator.CreateInstance(Type.GetType(type.ToString()));

        // Loop through the properties of the object you want to convert
        foreach (PropertyInfo pi in obj.GetType().GetProperties())
        {
            try
            {
                // Get the value of the property and try to assign it to the property of T type object
                tmp.GetType().GetProperty(pi.Name).SetValue(tmp, pi.GetValue(obj, null), null);
            }
            catch (Exception ex)
            {
                // Logging.Log.Error(ex);
            }
        }
        // Return the T type object
        return tmp;
    }
}    

public class Contacts
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Company { get; set; }
    public string Title { get; set; }
    public Addresses Address { get; set; }    
}

public class Addresses
{
    [Key]
    public int Id { get; set; }
    public string AddressType { get; set; }
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public State State { get; set; }
    public string PostalCode { get; set; }  
}

public class ContactContext : DbContext
{
    public DbSet<Addresses> Address { get; set; } 
    public DbSet<Contacts> Contacts { get; set; } 
    public DbSet<State> States { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = "Server=YourServer;Database=ContactsDb;Trusted_Connection=True;MultipleActiveResultSets=true;";
        optionsBuilder.UseSqlServer(connString);
        base.OnConfiguring(optionsBuilder);
    }
}


5

এই ইস্যুটির সর্বোত্তম সমাধান এখানে দেওয়া হয়েছে: দেখুন সমস্ত আইডি (কী) যুক্ত করুন। একাধিক সারণী নামকরণ করা বিবেচনা করুন (প্রথম, দ্বিতীয় এবং তৃতীয়)

@Html.HiddenFor(model=>model.FirstID)
@Html.HiddenFor(model=>model.SecondID)
@Html.HiddenFor(model=>model.Second.SecondID)
@Html.HiddenFor(model=>model.Second.ThirdID)
@Html.HiddenFor(model=>model.Second.Third.ThirdID)

সি # কোডে,

[HttpPost]
public ActionResult Edit(First first)
{
  if (ModelState.Isvalid)
  {
    if (first.FirstID > 0)
    {
      datacontext.Entry(first).State = EntityState.Modified;
      datacontext.Entry(first.Second).State = EntityState.Modified;
      datacontext.Entry(first.Second.Third).State = EntityState.Modified;
    }
    else
    {
      datacontext.First.Add(first);
    }
    datacontext.SaveChanges();
    Return RedirectToAction("Index");
  }

 return View(first);
}

5

Attachকোনও সত্তাকে যুক্ত করা তার ট্র্যাকিংয়ের স্থিতিতে সেট করবে Unchanged। একটি বিদ্যমান সত্তা আপডেট করতে, আপনাকে যা করতে হবে তা ট্র্যাকিংয়ের স্থিতিতে সেট করা আছে ModifiedEF6 ডক্স অনুসারে :

আপনার যদি এমন কোনও সত্তা থাকে যা আপনি জানেন যে ইতিমধ্যে ডাটাবেসে উপস্থিত রয়েছে তবে পরিবর্তিত পরিবর্তনগুলিও হতে পারে তবে আপনি সত্তাকে সংযুক্ত করার জন্য প্রসঙ্গটি বলতে পারেন এবং এর অবস্থার পরিবর্তিত অবস্থায় সেট করতে পারেন। উদাহরণ স্বরূপ:

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };

using (var context = new BloggingContext())
{
    context.Entry(existingBlog).State = EntityState.Modified;

    // Do some more work...  

    context.SaveChanges();
}

4
using(var myDb = new MyDbEntities())
{

    user user = new user();
    user.username = "me";
    user.email = "me@me.com";

    myDb.Users.Add(user);
    myDb.users.Attach(user);
    myDb.Entry(user).State = EntityState.Modified;//this is for modiying/update existing entry
    myDb.SaveChanges();
}

4

আমি একটি উপায় খুঁজে পেয়েছি যা ঠিক কাজ করে।

 var Update = context.UpdateTables.Find(id);
        Update.Title = title;

        // Mark as Changed
        context.Entry(Update).State = System.Data.Entity.EntityState.Modified;
        context.SaveChanges();


1

এখানে আমার পোস্ট-আরআইএ সত্তা-আপডেট পদ্ধতিটি (Ef6 সময় ফ্রেমের জন্য):

public static void UpdateSegment(ISegment data)
{
    if (data == null) throw new ArgumentNullException("The expected Segment data is not here.");

    var context = GetContext();

    var originalData = context.Segments.SingleOrDefault(i => i.SegmentId == data.SegmentId);
    if (originalData == null) throw new NullReferenceException("The expected original Segment data is not here.");

    FrameworkTypeUtility.SetProperties(data, originalData);

    context.SaveChanges();
}

নোট যে FrameworkTypeUtility.SetProperties()নুগেটে অটোম্যাপার এর আগে আমি লিখেছিলাম একটি ছোট্ট ইউটিলিটি ফাংশন:

public static void SetProperties<TIn, TOut>(TIn input, TOut output, ICollection<string> includedProperties)
    where TIn : class
    where TOut : class
{
    if ((input == null) || (output == null)) return;
    Type inType = input.GetType();
    Type outType = output.GetType();
    foreach (PropertyInfo info in inType.GetProperties())
    {
        PropertyInfo outfo = ((info != null) && info.CanRead)
            ? outType.GetProperty(info.Name, info.PropertyType)
            : null;
        if (outfo != null && outfo.CanWrite
            && (outfo.PropertyType.Equals(info.PropertyType)))
        {
            if ((includedProperties != null) && includedProperties.Contains(info.Name))
                outfo.SetValue(output, info.GetValue(input, null), null);
            else if (includedProperties == null)
                outfo.SetValue(output, info.GetValue(input, null), null);
        }
    }
}

দ্রষ্টব্য: কেবলমাত্র যদি আপনার বৈশিষ্ট্যগুলি আপনার ভিউমোডেল অবজেক্টে এটিতে সংরক্ষণ করা হচ্ছে ঠিক তেমন একই থাকে তবে তা কাজ করে।
vapcguy

1

রেনাত যেমন বলেছেন, সরিয়ে ফেলুন: db.Books.Attach(book);

এছাড়াও, "AsNoTracking" ব্যবহার করতে আপনার ফলাফলের ক্যোয়ারী পরিবর্তন করুন, কারণ এই কোয়েরিটি সত্তা ফ্রেমওয়ার্কের মডেল স্থিতিটি ফেলে দিচ্ছে। এটি "ফলাফল" হ'ল এটি এখন ট্র্যাক করার বই এবং আপনি এটি চান না।

var result = db.Books.AsNoTracking().SingleOrDefault(b => b.BookNumber == bookNumber);

1

চেষ্টা করে দেখুন ....

UpdateModel (বই);

var book = new Model.Book
{
    BookNumber =  _book.BookNumber,
    BookName = _book.BookName,
    BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
    var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
    if (result != null)
    {
        try
        {
            UpdateModel(book);
            db.Books.Attach(book);
            db.Entry(book).State = EntityState.Modified;
            db.SaveChanges();
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

1

আমি জানি এটি ইতিমধ্যে কয়েকবার ভাল উত্তর দেওয়া হয়েছে, তবে আমি এটি করার নীচের উপায় পছন্দ করি। আমি আশা করি এটি কাউকে সাহায্য করবে।

//attach object (search for row)
TableName tn = _context.TableNames.Attach(new TableName { PK_COLUMN = YOUR_VALUE});
// set new value
tn.COLUMN_NAME_TO_UPDATE = NEW_COLUMN_VALUE;
// set column as modified
_context.Entry<TableName>(tn).Property(tnp => tnp.COLUMN_NAME_TO_UPDATE).IsModified = true;
// save change
_context.SaveChanges();

1

এটি যদি সত্তা ফ্রেমওয়ার্কের জন্য 6.2.0।

আপনার যদি একটি নির্দিষ্ট DbSetএবং কোনও আইটেম থাকে যা আপডেট বা তৈরি করতে হবে:

var name = getNameFromService();

var current = _dbContext.Names.Find(name.BusinessSystemId, name.NameNo);
if (current == null)
{
    _dbContext.Names.Add(name);
}
else
{
    _dbContext.Entry(current).CurrentValues.SetValues(name);
}
_dbContext.SaveChanges();

তবে এটি DbSetএকটি একক প্রাথমিক কী বা যৌগিক প্রাথমিক কী সহ জেনেরিকের জন্যও ব্যবহার করা যেতে পারে ।

var allNames = NameApiService.GetAllNames();
GenericAddOrUpdate(allNames, "BusinessSystemId", "NameNo");

public virtual void GenericAddOrUpdate<T>(IEnumerable<T> values, params string[] keyValues) where T : class
{
    foreach (var value in values)
    {
        try
        {
            var keyList = new List<object>();

            //Get key values from T entity based on keyValues property
            foreach (var keyValue in keyValues)
            {
                var propertyInfo = value.GetType().GetProperty(keyValue);
                var propertyValue = propertyInfo.GetValue(value);
                keyList.Add(propertyValue);
            }

            GenericAddOrUpdateDbSet(keyList, value);
            //Only use this when debugging to catch save exceptions
            //_dbContext.SaveChanges();
        }
        catch
        {
            throw;
        }
    }
    _dbContext.SaveChanges();
}

public virtual void GenericAddOrUpdateDbSet<T>(List<object> keyList, T value) where T : class
{
    //Get a DbSet of T type
    var someDbSet = Set(typeof(T));

    //Check if any value exists with the key values
    var current = someDbSet.Find(keyList.ToArray());
    if (current == null)
    {
        someDbSet.Add(value);
    }
    else
    {
        Entry(current).CurrentValues.SetValues(value);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.