LINQ to Entities и создание нового экземпляра сущности - PullRequest
0 голосов
/ 04 февраля 2009

Я пытаюсь создать новый экземпляр объекта Customer в нашем приложении, и у меня возникло несколько проблем. Эта сущность имеет несколько навигационных свойств, каждое из которых имеет собственную навигацию. свойства. Например, каждый объект «Клиент» имеет объект «Адрес», а каждый объект «Адрес» имеет объект «Номер телефона» и т. Д. Я не выяснил, как получить новый набор данных для всех этих объектов. Я пробовал следующее:

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

В этот момент я получаю сообщение об ошибке «Ссылка на объект не установлена ​​для экземпляра объекта», поскольку адрес равен нулю. Первоначально я предполагал, что создание новой сущности клиента автоматически создаст новый экземпляр каждой сущности, с которой он связан, но это не должно иметь место. Может ли кто-нибудь предоставить пример кода, как это должно работать? Спасибо.

1 Ответ

1 голос
/ 04 февраля 2009

Во-первых, я был бы упущен, если бы не заметил, что адрес является типом значения; оно не имеет идентичности и не должно быть сущностью. Entity Framework поддерживает такие типы с помощью функции сложных типов. К сожалению, конструктор Entity Framework не поддерживает этого ( Edit: Исправлено в 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.
        };
}
...