2013-04-04 1 views
3

Предположим, у меня есть простая схема базы данных с таблицей клиентов и заказов с внешним ключом от заказов к клиентам и уникальный ключ по имени клиента.Как вставить в LINQ to SQL, когда у меня есть внешний ключ и уникальное ограничение?

Customers 
----------- 
[CustomerID] INT NOT NULL 
[Name] VARCHAR(50) NOT NULL  

Orders 
----------- 
[OrderID] INT NOT NULL 
[CustomerID] INT NOT NULL 

+------------+------+ +---------+------------+ 
| CustomerID | Name | | OrderID | CustomerID | 
|------------+------+ +---------+------------+ 
|   1 | John | |  1 |   1 | 
+------------+------+ +---------+------------+ 

Я создал LINQ к SQL сущностям очевидным образом, с Customer лицами и Order лица с один-ко-многим ассоциации из Customer в Order.

Проблема, с которой я столкнулась, возникает, когда я хочу ввести новый заказ для Джона, используя мои объекты LINQ. Я думал, что сделать это будет, чтобы получить объект Customer для Джона и назначить его моему объекту Order, а затем отправить его, но он не работает. Вот мой код C# для этого.

using (var db = new DataClassesDataContext()) 
{ 
    Order order = new Order(); 
    Customer existingCustomer = db.Customers.FirstOrDefault(c => c.Name == "John"); 

    if (existingCustomer == default(Customer)) 
    { 
     Customer customer = new Customer(); 
     customer.Name = "John"; 
     order.Customer = customer; 
    } 
    else 
    { 
     order.Customer = existingCustomer; 
    } 

    db.Orders.InsertOnSubmit(order); 
    db.SubmitChanges(); 
} 

Я проверил, что я действительно назначая existingCustomer к моим Order перед отправкой, но, несмотря на это, я все еще получаю уникальную ошибку ключа ограничения при попытке представить.

Я очень новичок в LINQ to SQL, поэтому, думаю, я просто ошибаюсь. Как мне реализовать свой код для учета уникального ограничения?

+1

Какое (внутреннее) сообщение об исключении вы получаете? –

+0

@GertArnold [Вот полное исключение, которое было брошено.] (Http://pastebin.com/raw.php?i=9ikD71yg) –

ответ

3

Линия

db.Orders.InsertOnSubmit(order); 

отмечает весь граф объектов для вставки. Поэтому, если вы переместите линию чуть ниже Order order = new Order();, то только заказ будет помечен для вставки. Это означает, что для нового клиента вы также должны позвонить InsertOnSubmit.

+0

Это изменение сработало для меня. Спасибо. –

0

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

Вы можете попробовать его с

Customer existingCustomer = db.Customers.Single(c => c.Name == "John"); 

и посмотреть, если вы получите исключение? В этом случае может быть что-то не так с DBML для таблицы клиентов.

Не помогает вам с вопросом, но поскольку у вас есть уникальное ограничение на имя Single/SingleOrDefault, это лучше, чем First/FirstOrDefault.

Смежные вопросы