كيفية ربط الكائنات من سياقات متعددة باستخدام إطار الكيان

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا جدا جديد في إطار الكيان ، لذا يرجى تتحمل معي...

كيف يمكنني ربط اثنين من الكائنات من سياقات مختلفة معا ؟

المثال أدناه يلقي الاستثناء التالي:

النظام.InvalidOperationException:على العلاقة بين كائنين لا يمكن تحديدها لأنها تعلق مختلفة ObjectContext الكائنات.

void MyFunction()
{
    using (TCPSEntities model = new TCPSEntities())
    {
        EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123);
        er.Roles = GetDefaultRole();
        model.SaveChanges();
     }
}

private static Roles GetDefaultRole()
{
    Roles r = null;
    using (TCPSEntities model = new TCPSEntities())
    {
        r = model.Roles.First(p => p.RoleId == 1);
    }
    return r;
}

باستخدام سياق واحد ليس خيارا لأننا باستخدام EF في ASP.NET التطبيق.

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

المحلول

سيكون لديك لاستخدام نفس السياق (يمكنك تمرير السياق إلى getdefaultrole طريقة) أو إعادة التفكير في العلاقات وتوسيع الكيان.

تحرير:أريد أن أضيف هذا كان على سبيل المثال باستخدام asp.net سوف تتطلب منك أعتقد تماما خارج سياق العلاقة التصاميم.

هل يمكن أن تمر ببساطة سياق..أي:

void MyFunction()
{
    using (TCPSEntities model = new TCPSEntities())
    {
        EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123);
        er.Roles = GetDefaultRole(model);
        model.SaveChanges();
     }

}

private static Roles GetDefaultRole(TCPSEntities model)
{
    Roles r = null;
    r = model.Roles.First(p => p.RoleId == 1);
    return r;
}

نصائح أخرى

نهج آخر التي يمكنك استخدامها هنا هو فصل الأجسام من السياق ، ومن ثم ضمها إلى سياق آخر.هذا هو قليلا من هاك, فإنه قد لا تعمل في الوضع الخاص بك, ولكن قد يكون خيارا.

    public void GuestUserTest()
    {
        SlideLincEntities ctx1 = new SlideLincEntities();
        GuestUser user = GuestUser.CreateGuestUser();
        user.UserName = "Something";
        ctx1.AddToUser(user);
        ctx1.SaveChanges();

        SlideLincEntities ctx2 = new SlideLincEntities();
        ctx1.Detach(user);
        user.UserName = "Something Else";
        ctx2.Attach(user);
        ctx2.SaveChanges();
    }

نعم - العمل عبر 2 أو أكثر من السياقات غير معتمد في V1 إطار كيان.

فقط في حال كنت لم تكن قد وجدت بالفعل ، هناك أسئلة وأجوبة على EF في http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx

من ما أفهم أنك تريد إنشاء النموذج الخاص بك (عن طريق "جديدة XXXXEntities()" بت) كما نادرا ما ممكن.وفقا MS (http://msdn.microsoft.com/en-us/library/cc853327.aspx) هذا كبير جدا في الأداء ضرب.حتى يلف في استخدام() هيكل ليس فكرة جيدة.ماذا فعلت في المشاريع هو الوصول إلى ذلك من خلال أسلوب ثابت أن يوفر دائما نفس الدرجة من السياق:

    private static PledgeManagerEntities pledgesEntities;
    public static PledgeManagerEntities PledgeManagerEntities
    {
        get 
        {
            if (pledgesEntities == null)
            {
                pledgesEntities = new PledgeManagerEntities();
            }
            return pledgesEntities; 
        }
        set { pledgesEntities = value; }
    }

ثم استرجاعها مثل ذلك:

    private PledgeManagerEntities entities = Data.PledgeManagerEntities;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top