【问题标题】:Navigation Properties become null after using clause使用子句后导航属性变为空
【发布时间】:2011-11-10 21:18:18
【问题描述】:

我的 ASP.Net 项目中有一个数据库实体模型

有两个foreignkeyconstructs,都是id之间的结构。

现在我正在尝试使用以下方法添加 100 个示例条目

            IntraNetEntities entities = new IntraNetEntities();

        if (entities.EmployeeList.Count() == 0)
        {
            using (entities)
            {
                for (int i = 0; i < 100; i++)
                {     

                    EmployeeList newEmployeeList = new EmployeeList()
                    {
                        department = "Standardabteilung",
                        mobile = i,
                        landline = 1 + i,
                        mail = "Standardemail",
                        position = "Standardfunktion",
                        shortcode = "abc",
                        lastname = "StandardNachname",
                        roomnumber = Convert.ToDouble(i),
                        firstname = "Standardvorname"
                    };

                    PrivateContact newPrivateContact = new PrivateContact()
                    {
                            city = "Standardstadt",
                            country = "deutscheland",
                            landline = i,
                            mail = "standardemail",
                            mobile = i * 2,
                            street = "standardstreet",
                            zip = i * 10,
                            EmployeeList = newEmployeeList
                    };

                    WorkContact newWorkContact = new WorkContact()
                    {
                        city = "Standardstadt",
                        country = "deutscheland",
                        landline = i * 9,
                        mobile = i * 12 / 8,
                        mail = "standardmail",
                        street = "standardstraße",
                        zip = i * 9,
                        EmployeeList = newEmployeeList
                    };

                    newEmployeeList.PrivateContact = newPrivateContact;
                    newEmployeeList.WorkContact = newWorkContact;

                    entities.AddToEmployeeList(newEmployeeList);
                    entities.AddToPrivateContact(newPrivateContact);
                    entities.AddToWorkContact(newWorkContact);

                }

                entities.saveChanges();

                return true;
            }
        }
        else
        {
            return false;
        }

我的问题是,当此方法结束时,我的导航属性会消失! 它们在调试时看起来都很好,但仍然在用例中,但之后它们都为空,而我没有对这些值进行任何更改。

如何保留导航值?

谢谢

【问题讨论】:

  • 我很清楚 - 你的意思是新的联系人和员工列表没有被持久化到数据库中吗?或者 newPrivateContact.EmployeeList 正在失去它的价值并变成空(如果这是你的意思,你如何在 using 之外访问 newPrivateContact ,因为它的范围在 using 本身之内)?还是别的什么?
  • 我只是想保留导航属性。我的意思是 newPrivateContact.EmployeeList 和/或 newEmployeeList.PrivateContact 正在失去它们的价值!鉴于 newEmployeeList 和 newPrivateContact 都是在此 using 子句之后的新 using 子句中调用和选择的元素

标签: c# linq linq-to-entities


【解决方案1】:

在其末尾使用调用“Dispose”。这就是您的导航属性下降的原因。来自 MSDN 网站:

using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所述使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

using 语句允许程序员指定使用资源的对象何时应该释放它们。

http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.80%29.aspx

【讨论】:

  • 那么有没有办法保存上下文,那些导航属性?
  • 好吧,如果您选择将其放在 Using 语句中,那么您就是在明确告诉程序在 using 范围完成后不要保存该上下文。从技术上讲,您并不总是需要 Using 语句,因此您可以尝试完全删除。我已经将一个小型应用程序周围的 Context obj 作为 ref 参数传递给各种库函数,这工作正常(尽管它可能无法很好地扩展)。
【解决方案2】:

退出using 块时,您的上下文将被释放。 导航属性需要现有的上下文。所以你必须确保你的上下文对象存在足够长的时间。

您可以考虑使用Autofac 或其他支持asp.net 的di 框架。

通过使用HttpRequestScoped() 扩展方法,您的上下文将根据网络请求的生命周期进行构造和处理:

builder.RegisterType<IntraNetEntities>().As<IntraNetEntities>().HttpRequestScoped();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多