我有一个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()。这将创建两个到数据库的往返,我想看看我是否可以在一个事务中执行此操作。有可能吗?
由于
答案 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 Value
为True
和{{1} }是Auto-Sync
(两者都不是默认值)。
答案 1 :(得分:1)
如果数据库中有外键关系,Customer
对象应该有一个名为Addresses
的集合,您可以Add
将您的地址实例称为b
。如果这样做,您不必明确地将地址添加到db.Addresses
,它将自动添加到框架中,并插入正确的客户ID。