使用Linq2Sql使用自动递增的主键将数据插入多个表

时间:2010-05-24 18:34:39

标签: c# linq-to-sql

我有一个Customer表,其中包含一个主键(int auto increment)和一个带有Customer表外键的Address表。我试图在一个不错的事务中将两行插入数据库。

using (DatabaseDataContext db = new DatabaseDataContext())
{
    Customer newCustomer = new Customer()
    {
        Email = customer.Email
    };

    Address b = new Address()
    {
        CustomerID = newCustomer.CustomerID,
        Address1 = billingAddress.Address1
    };

    db.Customers.InsertOnSubmit(newCustomer);
    db.Addresses.InsertOnSubmit(b);
    db.SubmitChanges();
}

当我运行这个时,我希望Customer和Address表自动在数据库中拥有正确的密钥,因为上下文知道这是一个自动递增的密钥,并且将在两个表中使用右键进行两次插入。

我能让它工作的唯一方法是首先在Customer对象上执行SubmitChanges()然后创建地址并对其执行SubmitChanges()。这将创建两个到数据库的往返,我想看看我是否可以在一个事务中执行此操作。有可能吗?

由于

2 个答案:

答案 0 :(得分:2)

Klaus基本上已经指定了你需要做的事 - 试试这段代码:

using (DatabaseDataContext db = new DatabaseDataContext())
{
    Customer newCustomer = new Customer()
    {
        Email = customer.Email
    };

    Address b = new Address()
    {
        Address1 = billingAddress.Address1
    };

    newCustomer.Address = b;

    db.Customers.InsertOnSubmit(newCustomer);
    db.SubmitChanges();
}

如果您将地址b与您刚刚创建的客户相关联,然后将该客户插入db.Customers集合,则调用db.SubmitChanges()应自动保存地址,另存为客户并修复任何IDENTITY列以使其工作。在测试用例中,它确实适用于我。

您尚未使用地址'或客户ID - 尚未设置。但是你绝对可以将完整的对象相互关联,从而在两者之间建立“连接”。

要使其正常工作,您需要确保在DBML设计器的两个ID列的Properties窗口中,Auto Generated ValueTrue和{{1} }是Auto-Sync(两者都不是默认值)。

答案 1 :(得分:1)

如果数据库中有外键关系,Customer对象应该有一个名为Addresses的集合,您可以Add将您的地址实例称为b。如果这样做,您不必明确地将地址添加到db.Addresses,它将自动添加到框架中,并插入正确的客户ID。