رمز EF أولاً - غير قادر على تحديث صف قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/4092004

سؤال

كان يجرب بعض التعليمات البرمجية باستخدام طريقة EF "الرمز الأول" وواجهت مشكلة غريبة.

datacontext الخاص بي:

    public class BookmarkerDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasKey(u => u.UserId);
            base.OnModelCreating(modelBuilder);
        }
     }

حيث يكون كائن المستخدم:

   public class User
    {
        public long UserId { get; set; }
        public ICollection<Tag> Tags { get; set; }
    }

في الكود الخاص بي ، أفعل شيئًا بسيطًا إلى حد ما:

public void UpdateUserTags(User user,ICollection<Tag> taglist)
    {
        user.Tags = new List<Tag>(user.Tags.Union(taglist));
        datacontext.Users.Add(user);
        datacontext.SaveChanges();
    }

كائن المستخدم الذي أعمره إلى هذه الوظيفة هو نتيجة لشيء مثل:

datacontext.Users.SingleOrDefault(u => u.UserId==id)

في كل مرة أتصل فيها بوظيفة updateUsertags ، يبدو أن إنشاء صف جديد في جدول المستخدم بدلاً من تحديثه. أفعل شيئا خطأ هنا؟

هل كانت مفيدة؟

المحلول

Donald صحيح ، تحتاج إلى ذلك Attach إلى ObjectContext عند إجراء التحديثات.

ومع ذلك ، هذا فقط إذا تم فصل كيانك.

إذا كان يبدو أنك قد استرجعت بالفعل الكيان المفرد من الرسم البياني:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);

مما يعني أنك لا تحتاج إلى إرفاقها أو الحصول عليها مرة أخرى. فقط افعل هذا:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);
user.Tags = new List<Tag>(user.Tags.Union(taglist));
context.SaveChanges();

ومع ذلك ، لا أوصي استبدال كامل العلامات مجموعة ، أضف العلامات:

user.Tags.Add(someTag);

HTH

نصائح أخرى

أعتقد أنك تريد يربط كائنك إلى سياق البيانات ، بدلاً من إضافته.

public void UpdateUserTags(User user,ICollection<Tag> taglist)
{
    datacontext.Attach(user);
    user.Tags = new List<Tag>(user.Tags.Union(taglist));
    datacontext.SaveChanges();
}

بمجرد إرفاقه ، يصبح السياق على دراية بالكائن. بمجرد حفظ التغييرات ، يجب أن تستمر في قاعدة البيانات.

لن هذا الخط

datacontext.users.add (user) ؛

حدد دائمًا سجل المستخدم على أنه يحتاج إلى إضافته إلى جدول المستخدمين.

أعتقد أنه يتعين عليك فصل المستخدم عن السياق القديم وإرفاقه بالذات الجديدة لتكون قادرًا على تحديث السجل بشكل صحيح. لكنني لست EF Wonk لذا ymmv

هذا لا علاقة له بمشكلتك الخاصة ، لكن بالنسبة للتحميل الكسول ، فأنت تريد تمييز العلامات الافتراضية

public virtual ICollection<Tag> Tags { get; set; }

أيضًا ، يبدو أنك تحاول إضافة علامات جديدة للمستخدم (أو تحديث علاماته) إذا كان هذا هو الحال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top