以下是我正在使用的相关技术:
这是挑战:
这是我的概念架构证明:
父表
儿童表
这是我的概念证明代码块:
using System;
using System.Data.Common;
using DevArtTry1.DataSet1TableAdapters;
namespace DevArtTry1
{
class Program
{
static void Main(string[] args)
{
using (DataContext1 dc = new DataContext1())
{
dc.Connection.Open();
using (DbTransaction transaction = dc.Connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
dc.Transaction = transaction;
Parent parent = new Parent();
parent.Id = 1;
parent.Name = "Parent 1";
dc.Parents.InsertOnSubmit(parent);
dc.SubmitChanges(); // By virtue of the Parent.Id -> Child.ParentId (M:N) foreign key, this statement will impose a write lock on the child table.
DataSet1.CHILDDataTable dt = new DataSet1.CHILDDataTable();
DataSet1.CHILDRow row = dt.NewCHILDRow();
row.ID = 1;
row.PARENTID = 1;
row.NAME = "Child 1";
dt.AddCHILDRow(row);
CHILDTableAdapter cta = new CHILDTableAdapter();
// cta.Transaction = transaction; Not allowed because you can't convert source type 'System.Data.Common.DbTransaction to target type 'System.Data.OracleClient.OracleTransaction.
cta.Update(dt); // The thread will encounter a deadlock here, waiting for a write lock on the Child table.
transaction.Commit();
}
}
Console.WriteLine("Successfully inserted parent and child rows.");
Console.ReadLine();
}
}
}
这是我的问题:
以下是两个有趣的脚注:
我尝试将事务显式附加到dataadapter,但编译器不允许它,因为它是一种不同类型的事务。
CHILDTableAdapter cta = new CHILDTableAdapter();
cta.Transaction = transaction; // Not allowed because you can't convert source type 'System.Data.Common.DbTransaction' to target type 'System.Data.OracleClient.OracleTransaction'.
cta.Update(dt);
transaction.Commit();
答案 0 :(得分:1)
我对甲骨文的交易一无所知......但在互联网方面你应该可以自己控制交易。确保两种技术都使用相同的连接实例。
当我们通过连接而不是通过ORM控制交易时,我们使用交易范围:http://msdn.microsoft.com/en-us/library/ms172152.aspx
答案 1 :(得分:1)
我遇到了同样的问题,遇到了这两个错误:
问题是未正确设置子对象的标识列。如果DotConnect LINQ不采用身份密钥,则对象属性似乎是临时设置的,导致非顺序更新,从而导致完整性违规。
以下是修复:
首先创建一个序列:
DROP SEQUENCE MyChild_SEQ; CREATE SEQUENCE MyChild_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20;
接下来创建OnInsert触发器:
CREATE OR REPLACE TRIGGER MyChild_AUTOINC BEFORE INSERT ON MyChildObject FOR EACH ROW BEGIN SELECT MyChild_SEQ.nextval INTO :NEW.MyChild_ID FROM dual; END MyChild_AUTOINC ; ALTER TRIGGER MyChild_AUTOINC ENABLE
修改存储模型以合并新的自动生成的主键:
在代码中,创建子对象后,将其附加到父对象,如下所示:
ChildType newChild = new ChildType(); DataContext.InsertOnSubmit(newChild); Parent.Child = newChild;
以下是更多资源:
干杯!
答案 2 :(得分:0)
使用TransactionScope类。
请注意,如果您使用的是不同的数据库(或者它们驻留在不同的服务器上),则需要检查DTC配置。