2010-05-24 58 views
4

我有一个主键(int自动增量)的客户表和一个地址表与客户表的外键。我试图在一个很好的事务中将两行插入到数据库中。使用Linq2Sql插入数据到多个表使用自动递增的主键

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对象执行SubmitChanges(),然后创建地址并对其执行SubmitChanges()。这将创建两个往返数据库,我想看看我是否可以在一个事务中做到这一点。可能吗?

感谢

回答

2

克劳斯基本上已经指定你需要做的是什么 - 试试这个代码:

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设计师,在Properties窗口两个ID列,该Auto Generated ValueTrueAuto-Sync是STE到OnInsert(两者都没有默认值) 。

1

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

相关问题