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


188

এখানে টেবিল

ব্যবহারকারীরা

UserId
UserName
Password
EmailAddress

এবং কোড ..

public void ChangePassword(int userId, string password){
//code to update the password..
}

26
দ্বারা Password, আপনি মানে পাসওয়ার্ড হ্যাশ মানে, তাই না? :-)
এডওয়ার্ড ব্রে

উত্তর:


368

লাডিসালভের উত্তর DbContext ব্যবহারের জন্য আপডেট হয়েছে (EF 4.1 তে প্রবর্তিত):

public void ChangePassword(int userId, string password)
{
  var user = new User() { Id = userId, Password = password };
  using (var db = new MyEfContextName())
  {
    db.Users.Attach(user);
    db.Entry(user).Property(x => x.Password).IsModified = true;
    db.SaveChanges();
  }
}

55
আমি কেবল db.Configration.ValidateOnSaveEn اهل = মিথ্যা যোগ করে এই কোডটি কাজ করতে সক্ষম হয়েছি; আগে db.SaveChanges ()?
জেক ড্র

3
কোন নেমস্পেসটি অন্তর্ভুক্ত করবেন এবং কী ব্যবহার করবেন db.Entry(user).Property(x => x.Password).IsModified = true;নাdb.Entry(user).Property("Password").IsModified = true;
জোহান

5
যখন টেবিলের টাইমস্ট্যাম্প ক্ষেত্র থাকে তখন এই পদ্ধতির একটি OptimisticConcurencyException নিক্ষেপ করে।
মাকসিম ভি।

9
আমি মনে করি এটি উল্লেখ করার মতো যে আপনি যদি ব্যবহার করছেন তবে আপনি যে db.Configuration.ValidateOnSaveEnabled = false;ক্ষেত্রটি আপডেট করছেন তা বৈধতা অব্যাহত রাখতে চাইতে পারেন:if (db.Entry(user).Property(x => x.Password).GetValidationErrors().Count == 0)
জিয়ুল ২15

2
আপনার টেবিলের যে ক্ষেত্রগুলি আপনার আপডেটের সময় আপনি সরবরাহ করছেন না তার জন্য যদি আপনার ভ্যালিডেটঅনসেসএইনবলটি সেট করতে হবে তা আপনাকে মিথ্যাতে সেট করতে হবে
সাল

54

আপনি EF কে বলতে পারবেন কোন বৈশিষ্ট্যগুলি এভাবে আপডেট করতে হবে:

public void ChangePassword(int userId, string password)
{
  var user = new User { Id = userId, Password = password };
  using (var context = new ObjectContext(ConnectionString))
  {
    var users = context.CreateObjectSet<User>();
    users.Attach(user);
    context.ObjectStateManager.GetObjectStateEntry(user)
      .SetModifiedProperty("Password");
    context.SaveChanges();
  }
}

অবজেক্টস্টেট
ম্যানেজারটি

16

আপনার কাছে মূলত দুটি বিকল্প রয়েছে:

  • EF পথে সমস্ত পথে যান, সেক্ষেত্রে, আপনি যাবেন
    • userIdপ্রদত্ত উপর ভিত্তি করে বস্তুটি লোড করুন - পুরো বস্তুটি লোড হয়ে যায়
    • আপডেট করুন passwordক্ষেত্রটি
    • প্রসঙ্গের .SaveChanges()পদ্ধতিটি ব্যবহার করে অবজেক্টটিকে আবার সংরক্ষণ করুন

এই ক্ষেত্রে, এটি কীভাবে বিশদভাবে পরিচালনা করতে হবে তা EF এর উপর নির্ভর করে। আমি কেবল এটি পরীক্ষা করেছি এবং ক্ষেত্রে আমি কেবলমাত্র একটি জিনিসের একক ক্ষেত্রটি পরিবর্তন করেছি, EF যা তৈরি করে তা আপনি নিজে নিজে তৈরি করতে চেয়েছিলেন - এরকম কিছু:

`UPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId`

সুতরাং কলামগুলি আসলেই বদলেছে তা নির্ধারণ করার জন্য EF যথেষ্ট স্মার্ট এবং এটি প্রয়োজনীয় এমন যে কেবল আপডেটগুলি পরিচালনা করতে এটি একটি টি-এসকিউএল বিবৃতি তৈরি করবে।

  • আপনি একটি সঞ্চিত প্রক্রিয়াটি সংজ্ঞায়িত করেন যা আপনার প্রয়োজন মতো হ'ল টি-এসকিউএল কোডে (কেবল Passwordপ্রদত্ত জন্য কলামটি আপডেট করুন UserIdএবং অন্য কিছুই নয় - মূলত সঞ্চালিত হয় UPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId) এবং আপনি আপনার EF মডেলের সেই সঞ্চিত পদ্ধতির জন্য একটি ফাংশন আমদানি তৈরি করেন এবং আপনি এটি কল করেন উপরে বর্ণিত পদক্ষেপগুলি না করে ফাংশন করুন

1
@ মার্ক-এস আসলে আপনাকে পুরো বস্তুটি লোড করতে হবে না!
অরবন্দ

13

সত্তা ফ্রেমওয়ার্ক কোর ইন, Attachপ্রবেশ ফিরিয়ে দেয়, তাই আপনার যা প্রয়োজন তা হ'ল:

var user = new User { Id = userId, Password = password };
db.Users.Attach(user).Property(x => x.Password).IsModified = true;
db.SaveChanges();

12

আমি এটি ব্যবহার করছি:

সত্তা:

public class Thing 
{
    [Key]
    public int Id { get; set; }
    public string Info { get; set; }
    public string OtherStuff { get; set; }
}

dbcontext:

public class MyDataContext : DbContext
{
    public DbSet<Thing > Things { get; set; }
}

অ্যাক্সেসর কোড:

MyDataContext ctx = new MyDataContext();

// FIRST create a blank object
Thing thing = ctx.Things.Create();

// SECOND set the ID
thing.Id = id;

// THIRD attach the thing (id is not marked as modified)
db.Things.Attach(thing); 

// FOURTH set the fields you want updated.
thing.OtherStuff = "only want this field updated.";

// FIFTH save that thing
db.SaveChanges();

1
আমি এটি চেষ্টা করার পরে সত্তার বৈধতা ত্রুটিগুলি পাই তবে এটি অবশ্যই দুর্দান্ত দেখায়।
devlord

এই পদ্ধতিটি কাজ করে না !!!: সম্ভবত এটি কীভাবে ব্যবহার করতে হয় তার জন্য আপনাকে আরও বিশদ দেওয়ার প্রয়োজন !!! - এটি ত্রুটি: "'ডোমেন.জব' প্রকারের সত্তাকে সংযুক্ত করা ব্যর্থ হয়েছে কারণ একই ধরণের অন্য সত্তার ইতিমধ্যে একই প্রাথমিক কী মান রয়েছে 'সংযুক্তি' পদ্ধতিটি ব্যবহার করার সময় বা কোনও সত্তার স্থিতি নির্ধারণের সময় এটি ঘটতে পারে যদি গ্রাফের কোনও সত্তার বিরোধী কী মান থাকে তবে 'অপরিবর্তিত' বা 'সংশোধিত' করতে পারেন This এটি কারণ হতে পারে যে কিছু সত্তা নতুন এবং এখনও ডাটাবেস-উত্পন্ন মূল মানগুলি গ্রহণ করেনি। "
লুসিয়ান বুম্ব

Perfec! যে কোনও মডেলের জন্য নমনীয় দৃষ্টিভঙ্গি দেখতে আমার উত্তরটি দেখুন!
ক্রিপ

10

এই সমস্যার সমাধান অনুসন্ধান করার সময়, প্যাট্রিক দেসজার্ডিন্স ব্লগের মাধ্যমে গনিয়েলের উত্তরে আমি একটি ভিন্নতা পেয়েছি :

public int Update(T entity, Expression<Func<T, object>>[] properties)
{
  DatabaseContext.Entry(entity).State = EntityState.Unchanged;
  foreach (var property in properties)
  {
    var propertyName = ExpressionHelper.GetExpressionText(property);
    DatabaseContext.Entry(entity).Property(propertyName).IsModified = true;
  }
  return DatabaseContext.SaveChangesWithoutValidation();
}

" আপনি দেখতে পাচ্ছেন যে এটির দ্বিতীয় পরামিতিটি কোনও ক্রিয়াকলাপের একটি অভিব্যক্তি হিসাবে লাগে This এটি লাম্বডা এক্সপ্রেশনটিতে নির্দিষ্ট করে কোন সম্পত্তি আপডেট করতে হবে তা নির্দিষ্ট করে এই পদ্ধতিটি ব্যবহার করবে " "

...Update(Model, d=>d.Name);
//or
...Update(Model, d=>d.Name, d=>d.SecondProperty, d=>d.AndSoOn);

(কিছুটা অনুরূপ সমাধান এখানেও দেওয়া হয়েছে: https://stackoverflow.com/a/5749469/2115384 )

আমি বর্তমানে নিজের কোডটিতে যে পদ্ধতিটি ব্যবহার করছি তা হ্যান্ডেল করার জন্যও প্রসারিত (লিঙ্ক) প্রকারের এক্সপ্রেশন ExpressionType.Convertএটি আমার ক্ষেত্রে প্রয়োজনীয় ছিল, উদাহরণস্বরূপ Guidএবং অন্যান্য বস্তুর বৈশিষ্ট্যগুলির সাথে। এগুলি একটি রূপান্তর () এ 'মোড়ানো' ছিল এবং সুতরাং এটি দ্বারা পরিচালিত হয় না System.Web.Mvc.ExpressionHelper.GetExpressionText

public int Update(T entity, Expression<Func<T, object>>[] properties)
{
    DbEntityEntry<T> entry = dataContext.Entry(entity);
    entry.State = EntityState.Unchanged;
    foreach (var property in properties)
    {
        string propertyName = "";
        Expression bodyExpression = property.Body;
        if (bodyExpression.NodeType == ExpressionType.Convert && bodyExpression is UnaryExpression)
        {
            Expression operand = ((UnaryExpression)property.Body).Operand;
            propertyName = ((MemberExpression)operand).Member.Name;
        }
        else
        {
            propertyName = System.Web.Mvc.ExpressionHelper.GetExpressionText(property);
        }
        entry.Property(propertyName).IsModified = true;
    }

    dataContext.Configuration.ValidateOnSaveEnabled = false;
    return dataContext.SaveChanges();
}

1
আমি যখন এটি ব্যবহার করি এটি আমাকে নিম্নলিখিত ত্রুটিটি দেয়, ল্যাম্বডা এক্সপ্রেশনটিকে 'এক্সপ্রেশন <ফানক <রিকুয়েস্টডেটেল, অবজেক্ট >> []' টাইপে রূপান্তর করতে পারে না কারণ এটি কোনও প্রতিনিধি প্রকার নয়
ইমরান রিজভী

@ ইমরান রিজভি, আপনাকে কেবলমাত্র এগুলিতে প্যারামিটারগুলি আপডেট করতে হবে: পাবলিক ইনট আপডেট (টি সত্তা, প্যারাম এক্সপ্রেশন <ফানক <টি, অবজেক্ট >> [] বৈশিষ্ট্য) এক্সপ্রেশন করার আগে
প্যারামগুলির

6

আমি এখানে খেলতে দেরি করছি, তবে আমি এটি এইভাবেই করছি, আমি যে সন্তুষ্টি পেয়েছি তার সমাধানের জন্য আমি কিছুটা সময় ব্যয় করেছি; এটি একটি উত্পাদন করেUPDATEপরিবর্তিত ক্ষেত্রগুলির জন্য এটি কেবলমাত্র বিবৃতি , যেমন আপনি একটি "সাদা তালিকা" ধারণার মাধ্যমে যা স্পষ্টভাবে তা সংজ্ঞায়িত করেন যা যাইহোক ওয়েব ফর্ম ইঞ্জেকশন রোধ করতে আরও সুরক্ষিত।

আমার আইসেশন ডেটা সংগ্রহস্থলের একটি অংশ:

public bool Update<T>(T item, params string[] changedPropertyNames) where T 
  : class, new()
{
    _context.Set<T>().Attach(item);
    foreach (var propertyName in changedPropertyNames)
    {
        // If we can't find the property, this line wil throw an exception, 
        //which is good as we want to know about it
        _context.Entry(item).Property(propertyName).IsModified = true;
    }
    return true;
}

এটি একটি চেষ্টাতে আবৃত হতে পারে .c আপনি চাইলে ধরুন, তবে আমি ব্যক্তিগতভাবে আমার কলারটিকে এই দৃশ্যের ব্যতিক্রমগুলি সম্পর্কে জানতে পছন্দ করি।

এটি এই ফ্যাশন মত কিছু বলা হবে (আমার জন্য, এটি একটি ASP.NET ওয়েব API এর মাধ্যমে ছিল):

if (!session.Update(franchiseViewModel.Franchise, new[]
    {
      "Name",
      "StartDate"
  }))
  throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));

2
সুতরাং আপনার আরও ভাল সমাধান কি এলিসা? আপনি কী বৈশিষ্ট্যগুলি আপডেট করার অনুমতি দিচ্ছেন তা স্পষ্টভাবে জানিয়ে দেওয়া উচিত (ঠিক যেমন এএসপি.নেট এমভিসি-র UpdateModelকমান্ডের জন্য প্রয়োজনীয় সাদা তালিকার মতো ), আপনি নিশ্চিত হন যে হ্যাকার ফর্ম ইঞ্জেকশনটি ঘটতে পারে না এবং তারা ক্ষেত্রগুলি আপডেট করতে পারে না যেগুলি আপডেট করার অনুমতি নেই are তবে যদি কেউ স্ট্রিং অ্যারেটিকে কোনও ধরণের ল্যাম্বডা এক্সপ্রেশন প্যারামিটারে রূপান্তর করতে পারে এবং এর সাথে Update<T>দুর্দান্ত কাজ করতে পারে
GONeale

3
@ গনিয়েল - কেবল পেরিয়ে যাচ্ছেন। ল্যাম্বডাস ব্যবহার করে
ডেভিড স্পেন্স

1
@ ইলিশা স্ট্রিংয়ের পরিবর্তে ফানক <টি, লিস্ট <object>> ব্যবহার করে এটি উন্নত করা যেতে পারে []
স্পঞ্জবব কমরেড

পরে এমনকি খেলা, এবং সম্ভবত এই অনেক আরো সাম্প্রতিক সিনট্যাক্স, কিন্তু var entity=_context.Set<T>().Attach(item);অনুসৃত দ্বারা entity.Property(propertyName).IsModified = true;লুপ কাজ করা উচিত।
অ্যাসপেক্স

4

সত্তা কাঠামো ডিবিটি কনটেক্সট দ্বারা ডেটাবেস থেকে জিজ্ঞাসা করা বস্তুগুলিতে আপনার পরিবর্তনগুলি ট্র্যাক করে। উদাহরণস্বরূপ, আপনি যদি DbContext উদাহরণের নাম dbContext হয়

public void ChangePassword(int userId, string password){
     var user = dbContext.Users.FirstOrDefault(u=>u.UserId == userId);
     user.password = password;
     dbContext.SaveChanges();
}

এবং এই ক্ষেত্রে মতামতটি কেমন হওয়া উচিত?
ইমানুয়েলা কোল্টা

এটি ভুল কারণ এটি পরিবর্তিত পাসওয়ার্ড সহ পুরো ব্যবহারকারীর অবজেক্টটি সংরক্ষণ করবে।
অমুলিয়র

এটি সত্য, তবে ব্যবহারকারীর বাকী অবজেক্টটি একই রকম হবে যেমনটি আগে প্রসঙ্গে ছিল, কেবল যে জিনিসটি সম্ভবত পৃথক হবে তা হ'ল পাসওয়ার্ড তাই এটি কেবল পাসওয়ার্ডটি আপডেট করে।
টমিসলভ ৩০০৮

3

আমি জানি এটি একটি পুরানো থ্রেড তবে আমিও অনুরূপ সমাধান খুঁজছিলাম এবং ঠিক করলাম @ ডোকু-যেমন সরবরাহিত সমাধানটি নিয়ে যাব। আমি ইমরান রিজভীর জিজ্ঞাসা করা প্রশ্নের উত্তর দিতে আমি মন্তব্য করছি, আমি @ ডোকু-সো লিঙ্কটি অনুসরণ করেছি যা একই রকম বাস্তবায়ন দেখায়। @ ইমরান রিজভীর প্রশ্ন ছিল যে প্রদত্ত সমাধানটি 'লাম্বডা এক্সপ্রেশনটিকে টাইপ' এক্সপ্রেশন> [] 'তে রূপান্তর করতে পারবেন না কারণ এটি কোনও প্রতিনিধি প্রকার নয় using আমি @ ডকু-সো এর সমাধানটিতে একটি ছোট্ট পরিবর্তন চাইছিলাম যা এই ত্রুটিটি ঠিক করে যদি অন্য কেউ এই পোস্ট জুড়ে আসে এবং @ ডোকু-এর সমাধানটি ব্যবহার করার সিদ্ধান্ত নেয়।

সমস্যাটি আপডেট পদ্ধতিতে দ্বিতীয় যুক্তি,

public int Update(T entity, Expression<Func<T, object>>[] properties). 

প্রদত্ত সিনট্যাক্স ব্যবহার করে এই পদ্ধতিটি কল করতে ...

Update(Model, d=>d.Name, d=>d.SecondProperty, d=>d.AndSoOn); 

দ্বিতীয় তর্কের সামনে আপনাকে অবশ্যই 'প্যারামস' কীওয়ার্ডটি যুক্ত করতে হবে।

public int Update(T entity, params Expression<Func<T, object>>[] properties)

অথবা আপনি যদি পদ্ধতিটির স্বাক্ষর পরিবর্তন করতে না চান তবে আপডেট পদ্ধতিটি কল করার জন্য আপনাকে যুক্ত করতে হবে ' নতুন ' কীওয়ার্ড যুক্ত করতে হবে, অ্যারের আকার নির্দিষ্ট করতে হবে, তবে শেষ পর্যন্ত প্রতিটি সম্পত্তি হিসাবে দেখা হিসাবে আপডেট করার জন্য সংগ্রহ অবজেক্ট ইনিশিয়ালাইজার সিনট্যাক্সটি ব্যবহার করুন নিচে.

Update(Model, new Expression<Func<T, object>>[3] { d=>d.Name }, { d=>d.SecondProperty }, { d=>d.AndSoOn });

@ ডোকু-এর উদাহরণে তিনি এক্সপ্রেশনগুলির একটি অ্যারে নির্দিষ্ট করে দিচ্ছেন যাতে আপনাকে অ্যারে আপডেট করার জন্য বৈশিষ্ট্যগুলি পাস করতে হবে কারণ অ্যারের কারণে আপনাকে অবশ্যই অ্যারের আকারও নির্দিষ্ট করতে হবে। এটি এড়ানোর জন্য আপনি অ্যারের পরিবর্তে আইনিম্যারেবল ব্যবহার করতে অভিব্যক্তি যুক্তিটিও পরিবর্তন করতে পারেন।

এখানে আমার @ ডকু-এর সমাধানের বাস্তবায়ন।

public int Update<TEntity>(LcmsEntities dataContext, DbEntityEntry<TEntity> entityEntry, params Expression<Func<TEntity, object>>[] properties)
     where TEntity: class
    {
        entityEntry.State = System.Data.Entity.EntityState.Unchanged;

        properties.ToList()
            .ForEach((property) =>
            {
                var propertyName = string.Empty;
                var bodyExpression = property.Body;
                if (bodyExpression.NodeType == ExpressionType.Convert
                    && bodyExpression is UnaryExpression)
                {
                    Expression operand = ((UnaryExpression)property.Body).Operand;
                    propertyName = ((MemberExpression)operand).Member.Name;
                }
                else
                {
                    propertyName = System.Web.Mvc.ExpressionHelper.GetExpressionText(property);
                }

                entityEntry.Property(propertyName).IsModified = true;
            });

        dataContext.Configuration.ValidateOnSaveEnabled = false;

        return dataContext.SaveChanges();
    }

ব্যবহার:

this.Update<Contact>(context, context.Entry(modifiedContact), c => c.Active, c => c.ContactTypeId);

@ ডোকু তাই জেনেরিকটি ব্যবহার করে একটি দুর্দান্ত দৃষ্টিভঙ্গি সরবরাহ করেছিল, আমি আমার সমস্যাটি সমাধান করার জন্য ধারণাটি ব্যবহার করেছি তবে আপনি কেবলমাত্র ডোকু-সলিউশনটি ব্যবহার করতে পারবেন না এবং এই পোস্ট এবং লিঙ্কযুক্ত পোস্টে ব্যবহার ত্রুটির প্রশ্নের উত্তর কেউই দেয়নি।


আমি যখন আপনার সমাধানে কাজ করছিলাম যখন প্রোগ্রামটি entityEntry.State = EntityState.Unchanged;প্যারামিটারের সমস্ত আপডেট হওয়া মানগুলি entityEntry
উল্টিয়ে দেয়

2

অ্যান্টিটি ফ্রেমওয়ার্ক কোর ২.x এ কোনও প্রয়োজন নেই Attach:

 // get a tracked entity
 var entity = context.User.Find(userId);
 entity.someProp = someValue;
 // other property changes might come here
 context.SaveChanges();

এসকিউএল সার্ভারে এটি চেষ্টা করে এবং এটি প্রোফাইলিং:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [User] SET [someProp] = @p0
WHERE [UserId] = @p1;
SELECT @@ROWCOUNT;

',N'@p1 int,@p0 bit',@p1=1223424,@p0=1

অনুসন্ধানটি নিশ্চিত করে যে ইতিমধ্যে লোড হওয়া সত্তাগুলি কোনও নির্বাচনকে ট্রিগার না করে এবং প্রয়োজনে স্বয়ংক্রিয়ভাবে সত্তাকে সংযুক্ত করে (ডক্স থেকে):

    ///     Finds an entity with the given primary key values. If an entity with the given primary key values
    ///     is being tracked by the context, then it is returned immediately without making a request to the
    ///     database. Otherwise, a query is made to the database for an entity with the given primary key values
    ///     and this entity, if found, is attached to the context and returned. If no entity is found, then
    ///     null is returned.

1

বেশ কয়েকটি পরামর্শের সংমিশ্রণে আমি নিম্নলিখিত প্রস্তাব করছি:

    async Task<bool> UpdateDbEntryAsync<T>(T entity, params Expression<Func<T, object>>[] properties) where T : class
    {
        try
        {
            var entry = db.Entry(entity);
            db.Set<T>().Attach(entity);
            foreach (var property in properties)
                entry.Property(property).IsModified = true;
            await db.SaveChangesAsync();
            return true;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("UpdateDbEntryAsync exception: " + ex.Message);
            return false;
        } 
    }

দ্বারা ডাকা

UpdateDbEntryAsync(dbc, d => d.Property1);//, d => d.Property2, d => d.Property3, etc. etc.);

অথবা দ্বারা

await UpdateDbEntryAsync(dbc, d => d.Property1);

অথবা দ্বারা

bool b = UpdateDbEntryAsync(dbc, d => d.Property1).Result;

অন্যান্য শ্রেণীর জন্য কীভাবে এই পদ্ধতিটি উপলব্ধ করা যায়, এটি এক্সটেনশন পদ্ধতির মতো হতে পারে?
ভেলকুমার

মধ্যে এই .NET কোর টিউটোরিয়াল তারা MVC আপডেট নির্দিষ্ট বৈশিষ্ট্য (নতুন) মতিন কোর ব্যবহার সর্বোত্তম অনুশীলন প্রদর্শন করুন। 'ট্রাইউপেটেটমডেলএেন্সেক' অনুসন্ধান করুন।
গায়

1
@ গুয় আশ্চর্য যদিও, মাইক্রোসফ্টের আরও একবার "সেরা অনুশীলন" তাদের সরঞ্জামগুলি যা তৈরি করে তা ছাড়া অন্য কিছু করা ...
অ্যাসপেক্স

এটি একটি ভাল সমাধান।
তীমথিয় মাচারিয়া

1

আমি ValueInjecterনিম্নলিখিত ব্যবহার করে ডাটাবেস সত্তায় বাইন্ডিং মডেলকে ইনজেক্ট করতে নুগেট ব্যবহার করি :

public async Task<IHttpActionResult> Add(CustomBindingModel model)
{
   var entity= await db.MyEntities.FindAsync(model.Id);
   if (entity== null) return NotFound();

   entity.InjectFrom<NoNullsInjection>(model);

   await db.SaveChangesAsync();
   return Ok();
}

কাস্টম কনভেনশন ব্যবহারের বিষয়টি লক্ষ্য করুন যা বৈশিষ্ট্যগুলি সার্ভার থেকে বাতিল হয়ে থাকলে আপডেট করে না।

ValueInjecter v3 +

public class NoNullsInjection : LoopInjection
{
    protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
    {
        if (sp.GetValue(source) == null) return;
        base.SetValue(source, target, sp, tp);
    }
}

ব্যবহার:

target.InjectFrom<NoNullsInjection>(source);

মান ইনজেকটার ভি 2

এই উত্তর দেখুন

বিচারকার্য স্থগিত রাখার আদেশ

আপনি জানবেন না যে সম্পত্তিটি ইচ্ছাকৃতভাবে বাতিল হয়ে গেছে বা এটির কোনও মূল্য নেই। অন্য কথায়, সম্পত্তি মানটি কেবলমাত্র অন্য মান দিয়ে প্রতিস্থাপন করা যায় তবে সাফ করা যায় না।


0

আমি একই সন্ধান করছিলাম এবং অবশেষে আমি সমাধানটি খুঁজে পেলাম

using (CString conn = new CString())
{
    USER user = conn.USERs.Find(CMN.CurrentUser.ID);
    user.PASSWORD = txtPass.Text;
    conn.SaveChanges();
}

বিশ্বাস করুন এটি আমার জন্য কবজির মতো কাজ করে।


0

এটি আমি কাস্টম ইনজেক্টননল (ওজেক্ট ডেস্ট, ওজেক্ট এসসিআর) ব্যবহার করে এটি এটিকে সম্পূর্ণ নমনীয় করে তুলি

[HttpPost]
public async Task<IActionResult> Post( [FromQuery]Models.Currency currency ) {
  if ( ModelState.IsValid ) {
    // find existing object by Key
    Models.Currency currencyDest = context.Currencies.Find( currency.Id ); 

    context.Currencies.Attach( currencyDest );

    // update only not null fields
    InjectNonNull( currencyDest, currency );

    // save
    await context.SaveChangesAsync( );
  }  
  return Ok();
}

// Custom method
public static T InjectNonNull<T>( T dest, T src ) {
  foreach ( var propertyPair in PropertyLister<T, T>.PropertyMap ) {
    var fromValue = propertyPair.Item2.GetValue( src, null );
    if ( fromValue != null && propertyPair.Item1.CanWrite ) {
       propertyPair.Item1.SetValue( dest, fromValue, null );
    }
  }
  return dest;
}

-1
public async Task<bool> UpdateDbEntryAsync(TEntity entity, params Expression<Func<TEntity, object>>[] properties)
{
    try
    {
        this.Context.Set<TEntity>().Attach(entity);
        EntityEntry<TEntity> entry = this.Context.Entry(entity);
        entry.State = EntityState.Modified;
        foreach (var property in properties)
            entry.Property(property).IsModified = true;
        await this.Context.SaveChangesAsync();
        return true;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

-7
public void ChangePassword(int userId, string password)
{
  var user = new User{ Id = userId, Password = password };
  using (var db = new DbContextName())
  {
    db.Entry(user).State = EntityState.Added;
    db.SaveChanges();
  }
}

1
এটি একটি নতুন সারি যুক্ত করবে। প্রশ্নটি কীভাবে একটি বিদ্যমান আপডেট করবেন।
এডওয়ার্ড ব্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.