4

假设我有一个简单的数据库模式,其中包含一个客户和订单表,其中包含从订单到客户的外键,以及客户名称的唯一键。

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 to SQL 实体,其中包含一个Customer实体和一个具有从toOrder的一对多关联的实体。CustomerOrder

当我想使用我的 LINQ 实体为 John 输入新订单时,我遇到了这个问题。我认为这样做的方法是Customer为 John 获取实体并将其分配给我的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 很陌生,所以我认为我只是在错误地处理这个问题。我应该如何实现我的代码来解决唯一约束?

4

2 回答 2

4

线

db.Orders.InsertOnSubmit(order);

将整个对象图标记为插入。因此,如果您将该行移至正下方Order order = new Order();,则仅将订单标记为插入。这意味着对于新客户,您也必须致电InsertOnSubmit

于 2013-04-04T19:00:47.223 回答
0

我认为你的代码应该没问题。不知何故,它试图插入一个新客户,但这不应该发生。

你能试试吗

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

看看你有没有例外?在这种情况下,客户表的 DBML 可能有问题。

不能帮助您解决问题,但由于您对名称有唯一约束,因此Single / SingleOrDefault优于First/FirstOrDefault.

于 2013-04-04T20:56:56.313 回答