LINQ to Entities和创建实体的新实例

时间:2009-02-04 15:40:44

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

我正在尝试在我们的应用程序中创建一个Customer实体的新实例,我遇到了一些问题。该实体具有多个导航属性,每个属性都有自己的导航。属性。例如,每个Customer实体都有一个Address实体,每个Address实体都有一个Phone Number实体等。我还没想出如何为所有这些实体获取新的数据集。我尝试了以下内容:

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

此时,我得到“对象引用未设置为对象的实例”错误,因为Address为null。我原先假设创建新的客户实体会自动创建与其相关的每个实体的新实例,但事实并非如此。有人可以提供一个代码示例,说明它应该如何工作?感谢。

1 个答案:

答案 0 :(得分: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.
        };
}