Вставить новый объект с реализацией в новые объекты с идентификатором столбца - PullRequest
0 голосов
/ 02 января 2011

Класс клиента:

class Customer 
{ 
  int id; 
  int phone;
  int fax;
  PhoneNumber phone1;
  PhoneNumber fax1;
}

Class PhoneNumber
{
int id;
int prefixid;
string number;
}

PhoneNumber был автоматически сгенерирован EF4, я изменил автоматически сгенерированные имена на phone1 и fax1

ИД номера телефона, и идентификатор клиента являются столбцами идентификаторов в БД.

Теперь я хочу создать нового клиента:

       var newCustomer = Customer.CreateCustomer(0, CompanyID);
        PhoneNumber fax = new PhoneNumber();
        PhoneNumber phone = new PhoneNumber();

        fax.Customers.Add(newCustomer);
        phone.Customers.Add(newCustomer);

        context.Customers.AddObject(newCustomer);
        context.SaveChanges();

Но теперь я получаю:

System.Data.UpdateException: {"Невозможно вставить явное значение для идентичности столбец в таблице «PhoneNumber», когда Для параметра IDENTITY_INSERT установлено значение OFF. "}

Почему EF4 не обрабатывает столбец идентификаторов связанной таблицы, поскольку он должен иметь дело с новым объектом? Как я могу сделать эту работу?

(EF4 Нужно было создать 2 записи в таблице телефонов, получить их удостоверение личности и добавить их в ряд новых клиентов - по крайней мере, то, что я хочу сделать)

Я знаю, что могу создать 2 записи телефона, а затем создать запись клиента, но

а. Я хочу, чтобы это было сделано в одном действии.

б. если создание клиента не удается - я не хочу пустых записей в таблице телефонов ...

1 Ответ

1 голос
/ 03 января 2011

Ну, эти две вещи противоречат друг другу:

И номер телефона, и идентификатор клиента являются столбцами идентификаторов в БД.

Но тогда ошибка:

System.Data.UpdateException: {"Невозможно вставить явное значение для столбца идентификатора в таблице 'PhoneNumber', когда для IDENTITY_INSERT задано значение OFF."}

Может показаться, что эта ошибкаговорит, что устанавливается дублирующая идентификация, но это не так - это говорит о том, что вы пытаетесь явно установить поле идентификации.

Это означает, что столбец идентификатора в PhoneNumber равен , а не поле идентификации .Или, по крайней мере, EF не думает, что это так.

Итак, у меня есть четыре вопроса:

1) Подтвердили ли вы, что в EDMX задано значение IDENTITY?Может быть, что-то изменило это?

2) Что делает метод CreateCustomer?Это просто новый клиент и установить некоторые свойства?Оно не должно касаться полей идентификации.

3) Правильно ли настроены навигационные свойства / мощности на EDMX?Например, 1 клиент. 1- * номера телефонов.

4) Попробуйте добавить номер телефона к клиенту, а не наоборот.Имеет смысл добавить «многие» к «одному» - например, здесь указывается совокупность Customer:

var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.phone1 = new PhoneNumber();
newCustomer.fax1 = new PhoneNumber();
context.Customers.AddObject(newCustomer);
context.SaveChanges();

Я бы также предложил изменить дизайн вашей модели.

Глупо иметьКлиент с 1 факсом и 1 номером телефона, каждый со свойством там.У Клиента должно быть много сущностей PhoneNumber.

Вы можете использовать TPH для сущности PhoneNumber, чтобы различать Факс и другие типы, и приведенный выше код будет иметь гораздо больший смысл:

var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.Phones.Add(new FaxNumber());
newCustomer.Phones.Add(new MobileNumber());
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...