【问题标题】:LINQ to Entities and creating a new instance of an entityLINQ to Entities 并创建实体的新实例
【发布时间】:2009-02-04 15:40:43
【问题描述】:

我正在尝试在我们的应用程序中创建客户实体的新实例,但遇到了一些问题。这个实体有几个导航属性,每个都有自己的导航。特性。例如,每个客户实体都有一个地址实体,每个地址实体都有一个电话号码实体等。我还没有弄清楚如何为所有这些实体获取新数据集。我尝试了以下方法:

context.Customers newCustomer = context.Customers.CreateCustomer(...);
newCustomer.FirstName = firstNameTextBox.Text;
newCustomer.Address.Street = streetTextBox.Text;   // this is where the error is thrown

此时,我收到“对象引用未设置为对象的实例”错误,因为地址为空。我最初假设创建新的客户实体会自动为与其相关的每个实体创建一个新实例,但事实并非如此。有人可以提供一个代码示例来说明这应该如何工作吗?谢谢。

【问题讨论】:

    标签: .net linq ado.net linq-to-entities wcf-data-services


    【解决方案1】:

    首先,如果我没有注意到地址是值类型,那我就失职了;它没有身份,也不应该是一个实体。实体框架通过复杂类型功能支持此类类型。不幸的是,实体框架设计器对此的支持为零(编辑:在 VS 2010 中已修复),因此使用该功能的唯一方法是手动编辑 EDMX。碰巧,Address 是大多数示例中使用的类型,请参阅您可能需要考虑这一点。

    不过,我真的会回答你提出的问题。

    简单的解决方案是:

    newCustomer.Address = new Address()
        {
            Street = streetTextBox.Text,
            // etc.
        };
    

    但是,由于 Address 确实是一个值类型(换句话说,具有完全相同街道地址的两个客户可能应该指向同一个 Address 对象),您可能需要尝试从之前的上下文中选择一个现有的 Address 对象你就去换一个新的。

    newCustomer.Address = (from Addresses in context where ...).FirstOrDefault();
    if (newCustomer.Address == null)
    {
        newCustomer.Address = new Address()
            {
                Street = streetTextBox.Text,
                // etc.
            };
    }
    

    【讨论】:

    • Null 合并运算符在这里非常好:custom.Address = (from a in db).FirstOrDefault() ?? new Address { Street = "street" };
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多