سؤال

أحاول اختبار فصل كيان من السياق ، إجراء التعديلات على ذلك, خلق سياق جديد ، إرفاقها ، وبعد التغييرات التي تم إجراؤها بين الدورات مستمرة.أنا لا يبدو أن تكون قادرة على الحصول على هذا العمل بشكل مناسب.لقد حاولت الاتصال DetectChanges وكذلك ApplyCurrentValues w/ أي نجاح.وفيما يلي ما لدي حتى الآن.هذه ليست POCO و أنا لا أريد أن التعامل معها على هذا النحو.أنا فقط أريد أن أكون قادرا على فصل كيان ، إجراء تغييرات عليه ، وإعادة نعلق عليه.وذلك بفضل!

OCConsumer consumer;

using (var ctx1 = new CMSStagingContext())
{
    consumer = (from c in ctx1.OCConsumers
            select c).FirstOrDefault();

    Console.WriteLine("Retrieved {0} - {1} {2}",
        consumer.CustomerId, consumer.FirstName, consumer.LastName);

    ctx1.Detach(consumer);
}

consumer.BirthDate = "10/22/1981";

using (var ctx2 = new CMSStagingContext())
{
    ctx2.Attach(consumer);
    ctx2.ApplyCurrentValues("OCConsumers", consumer);
    ctx2.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave | System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
}
هل كانت مفيدة؟

المحلول

عند إرفاق كائن إلى السياق ، سياق سوف أفترض أن الكائن غير معدلة, إلا إذا كنت تقول خلاف ذلك.أبسط طريقة للقيام بذلك هو أن نعلق الكائن إلى السياق أولا ، ثم تعديله.حتى يمكنك تغيير التعليمات البرمجية إلى:

OCConsumer consumer;

using (var ctx1 = new CMSStagingContext())
{
    consumer = (from c in ctx1.OCConsumers
            select c).FirstOrDefault();

    Console.WriteLine("Retrieved {0} - {1} {2}",
        consumer.CustomerId, consumer.FirstName, consumer.LastName);

    ctx1.Detach(consumer);
}

using (var ctx2 = new CMSStagingContext())
{
    ctx2.Attach(consumer);
    consumer.BirthDate = "10/22/1981";
    ctx2.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave | System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
}

وثمة نهج آخر استخدام السياق.ObjectStateManager.ChangeObjectState.

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