Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net LINQ到实体并创建实体的新实例_.net_Linq_Ado.net_Linq To Entities_Wcf Data Services - Fatal编程技术网

.net LINQ到实体并创建实体的新实例

.net LINQ到实体并创建实体的新实例,.net,linq,ado.net,linq-to-entities,wcf-data-services,.net,Linq,Ado.net,Linq To Entities,Wcf Data Services,我试图在我们的应用程序中创建一个新的客户实体实例,但遇到了一些问题。此实体具有多个导航属性,每个属性都有自己的导航。财产。例如,每个客户实体都有一个地址实体,每个地址实体都有一个电话号码实体等等。我还没有弄清楚如何获取所有这些实体的新数据集。我尝试了以下方法: context.Customers newCustomer = context.Customers.CreateCustomer(...); newCustomer.FirstName = firstNameTextBox.Text; n

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

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

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

首先,如果我没有注意到地址是一种值类型,那我就失职了;它没有标识,不应该是一个实体。实体框架通过复杂类型功能支持此类类型。不幸的是,Entity Framework designer对此没有任何支持(编辑:在VS 2010中已修复),因此使用此功能的唯一方法是手动编辑EDMX。事实上,地址是大多数示例中使用的类型,请参阅您想考虑的内容。

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

简单的解决办法是:

newCustomer.Address = new Address()
    {
        Street = streetTextBox.Text,
        // etc.
    };
但是,由于Address实际上是一种值类型(换句话说,两个拥有完全相同街道地址的客户可能会指向同一地址对象),因此您可能需要尝试从上下文中选择一个现有地址对象,然后再创建一个新的地址对象

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

Null合并运算符在这里非常好:
custom.Address=(从数据库中的a开始)。FirstOrDefault()??新地址{Street=“Street”}