ORM设计的软件中,对数据保存处理??高手请进??

jsjkhanwei 2009-09-01 09:09:58
我在用ORM过程有一事不明白,请高手指导?
如:我做了一张采购入库单. 如果用ORM把数据保后的同时,要求把库存给增加,并把合给减少,这三个步骤,如果执行中间时出错呢?第一步的采购入库单,已被保存到数据库了,而后,两步没有执行,在以前我用事务处理,可以把这三个放在同一个事务中,如果有一个失败,数据会被自动恢复.如今在ORM中,如何实现?????
...全文
163 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuike519 2009-11-26
  • 打赏
  • 举报
回复
看看Hibernate...

.NET版本的叫NHibernate
qqselliter 2009-11-26
  • 打赏
  • 举报
回复
java 的一个翻版
问问java同志们就知道了。
acqy 2009-11-24
  • 打赏
  • 举报
回复
贴一段基于NHibernate框架所实现的事务utility类以作参考:

/// <summary>
/// Represents the NHibernate version of the transaction context, which is
/// the default transaction context implementation used by Apworks Server Application.
/// </summary>
public sealed class DbTransactionContext : TransactionContextBase
{
#region Private Fields
/// <summary>
/// The <see cref="NHibernate.ITransaction"/> object that handles transactions.
/// </summary>
private ITransaction transaction;

#endregion

#region Constructors
/// <summary>
/// Constructs the transaction context by using the default isolation level (Unspecified level).
/// </summary>
public DbTransactionContext() : base() { }

/// <summary>
/// Constructs the transaction context by using the given isolation level.
/// </summary>
/// <param name="isolationLevel">The isolation level which is used for initializing the
/// transaction context.</param>
public DbTransactionContext(IsolationLevel isolationLevel) : base(isolationLevel) { }
#endregion

public ISession Session { get { return DatabaseSessionFactory.Instance.Session; } }

#region ITransactionContext Members
/// <summary>
/// Begins a transaction.
/// </summary>
public override void BeginTransaction()
{
transaction = DatabaseSessionFactory.Instance.Session.BeginTransaction(this.isolationLevel);
}
/// <summary>
/// Commits the transaction.
/// </summary>
public override void Commit()
{
transaction.Commit();
}
/// <summary>
/// Rolls back the transaction.
/// </summary>
public override void Rollback()
{
transaction.Rollback();
}
#endregion

#region IDisposable Members
/// <summary>
/// Disposes the transaction context.
/// </summary>
public override void Dispose()
{
// Disposes the transaction object.
transaction.Dispose();
// If the session used by the transaction context exists and is still
// open, close the session. This ensures that when next time the client
// access the database, new session will be opened.
ISession databaseSession = DatabaseSessionFactory.Instance.Session;
if (databaseSession != null && databaseSession.IsOpen)
{
//databaseSession.Flush();
databaseSession.Close();
}
}

#endregion


使用:

// 此处将获得一个DbTransactionContext的实例
using (ITransactionContext transContext = TransactionContextManager.GetContext())
{
try
{
transContext.BeginTransaction();
// ... 你的逻辑
transContext.Commit()
}
catch
{
transContext.Rollback();
throw;
}
}
acqy 2009-11-24
  • 打赏
  • 举报
回复
支持C#的ORM?常见的就是NHibernate,它可以通过session来获得transaction对象,从而实现事务处理。
其次就是基于NHibernate的Castle Active Record。严格的说它并不能算是ORM,虽然有保存、读取数据的能力。因为它把业务对象和持久化的技术细节混在一起了。
再就是可以使用.NET 4.0的Entity Framework,在Entity Framework中,事务会由Entity Framework控制,一般情况下开发人员可以不用太担心事务的问题。
aspdiannet 2009-11-23
  • 打赏
  • 举报
回复
存储过程
。。。
Taiyangchen 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
还是要使用事务处理,如LINQ,spring.net
[/Quote]up
talen_lu 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ourola 的回复:]
依然用事务..事务有很多种啊..
C# code///<summary>/// 保存明细和单据///</summary>///<param name="dt">要保存的DataTable</param>///<param name="hash">包含insert,update,delete的Hashtable</param>///<returns>功能T,失败F</returns>publicbool UpdateDetailAndBill(DataTable dt, Hashtable hash)
{if (trans==null)
{
trans= conn.BeginTransaction();
_billCommand.Transaction= trans;
}

SqlCommand _deleteCommand=new SqlCommand(hash["delete"].ToString(), conn, trans);
_deleteCommand.CommandType= CommandType.StoredProcedure;

SqlCommand insertCommand=new SqlCommand(hash["insert"].ToString(), conn, trans);
insertCommand.CommandType= CommandType.StoredProcedure;

DataMapping dmaping=new DataMapping(conn);
_detailCommand=new SqlCommand(hash["update"].ToString(), conn, trans);
_detailCommand.CommandType= CommandType.StoredProcedure;
SqlDataAdapter da=new SqlDataAdapter();

_detailCommand= dmaping.getStroeProcedureParamsByName(_detailCommand);
_deleteCommand= dmaping.getStroeProcedureParamsByName(_deleteCommand);
insertCommand= dmaping.getStroeProcedureParamsByName(insertCommand);

da.InsertCommand= insertCommand;
da.UpdateCommand= _detailCommand;
da.DeleteCommand= _deleteCommand;
da.InsertCommand.UpdatedRowSource= UpdateRowSource.OutputParameters;
da.UpdateCommand.UpdatedRowSource= UpdateRowSource.OutputParameters;
da.DeleteCommand.UpdatedRowSource= UpdateRowSource.OutputParameters;
da.UpdateBatchSize=1;try
{//_deleteCommand.ExecuteNonQuery();int j= _billCommand.ExecuteNonQuery();int i= da.Update(dt);
dt.AcceptChanges();
trans.Commit();();//如果成功,提交事务returntrue;
}catch (Exception ex)
{
trans.Rollback();//如果失败,回滚事务throw ex;
}finally
{
conn.Close();
}
}
[/Quote]
对sql可能就成功,对oracole db2会出错
ladyuncle 2009-10-13
  • 打赏
  • 举报
回复
事务!
zhou5157 2009-10-06
  • 打赏
  • 举报
回复
存储过程
laomeng520 2009-10-06
  • 打赏
  • 举报
回复
学习了
ourola 2009-10-05
  • 打赏
  • 举报
回复
依然用事务..事务有很多种啊..

/// <summary>
/// 保存明细和单据
/// </summary>
/// <param name="dt">要保存的DataTable</param>
/// <param name="hash">包含insert,update,delete的Hashtable</param>
/// <returns>功能T,失败F</returns>
public bool UpdateDetailAndBill(DataTable dt, Hashtable hash)
{
if (trans == null)
{
trans = conn.BeginTransaction();
_billCommand.Transaction = trans;
}

SqlCommand _deleteCommand = new SqlCommand(hash["delete"].ToString(), conn, trans);
_deleteCommand.CommandType = CommandType.StoredProcedure;

SqlCommand insertCommand = new SqlCommand(hash["insert"].ToString(), conn, trans);
insertCommand.CommandType = CommandType.StoredProcedure;

DataMapping dmaping = new DataMapping(conn);
_detailCommand = new SqlCommand(hash["update"].ToString(), conn, trans);
_detailCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter();

_detailCommand = dmaping.getStroeProcedureParamsByName(_detailCommand);
_deleteCommand = dmaping.getStroeProcedureParamsByName(_deleteCommand);
insertCommand = dmaping.getStroeProcedureParamsByName(insertCommand);

da.InsertCommand = insertCommand;
da.UpdateCommand = _detailCommand;
da.DeleteCommand = _deleteCommand;
da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
da.UpdateCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
da.DeleteCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
da.UpdateBatchSize = 1;
try
{
//_deleteCommand.ExecuteNonQuery();
int j = _billCommand.ExecuteNonQuery();
int i = da.Update(dt);
dt.AcceptChanges();
trans.Commit();();//如果成功,提交事务
return true;
}
catch (Exception ex)
{
trans.Rollback();//如果失败,回滚事务
throw ex;
}
finally
{
conn.Close();
}
}

jsjkhanwei 2009-09-02
  • 打赏
  • 举报
回复
在框加上如何添加事务处理???在.NET下有什么好的ORM工具?
wuyq11 2009-09-01
  • 打赏
  • 举报
回复
还是要使用事务处理,如LINQ,spring.net
cuike519 2009-09-01
  • 打赏
  • 举报
回复
至于具体怎么用要看你的ORM框架如何支持了。
cuike519 2009-09-01
  • 打赏
  • 举报
回复
还是用事务啊...
jsjkhanwei 2009-09-01
  • 打赏
  • 举报
回复
如:我做了一张采购入库单. 如果用ORM把数据保后的同时,要求把库存增加,并把合同有采购数量同时减少,这三个步骤,如果执行时,中间有一个出错?第一步的采购入库单,已被保存到数据库了,而后,两步没有执行,在以前我用事务处理,可以把这三个放在同一个事务中,如果有一个失败,数据会被自动恢复.如今在ORM中,如何实现?????
适合人群: 1、具有一定Python语言基础,有一定的web前端基础,想要深入学习Python Web框架的朋友; 2、学习完“跟着王进老师学开发Python篇”“跟着王进老师学Web前端开发”的朋友; 3、有Django基础,但是想学习企业级项目实战的朋友; 4、喜欢 Django 框架并想深入研究的朋友; 5、有一定的数据库基础   课程目标:本系列课程是从零基础开始并深入讲解Django,最终学会使用Django框架开发企业级的项目。课程知识点全网最详细,项目实战贴近企业需求。本系列课程除了非常详细的讲解Django框架本身的知识点以外,还讲解了web开发所需要用到的技术,学完本系列课程后,您将独立做出一个具有后台管理系统,并且前端非常优美实用的网站。   课程内容:在人工智能大行其道的时代,许多开发者对Python这门编程语言都比较熟悉。但是如何用它实现一个企业级别的项目,可能许多朋友还存在一些困惑。联科教育“跟着王进老师学Python”系列课程是专门针对想要从事Python Web开发的朋友而准备的,并且按照企业需求的标准定制的学习路线。学习路线包含Python基础和进阶、Web前端、MySQL数据库、Flask和Django框架以及N多个企业真实项目。在学习完本系列所有的课程后,从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的事情,掌握实现全栈开发,让你升职加薪不是梦! 本季课程介绍了DjangoORM模型,使用ORM模型的优势;DjangoORM模型常用的字段,ORM实现数据查询;Django后台管理等。所有应用均通过案例“在线图书商城”完成讲解和演示,完整项目,贯穿全部知识点,边学边练,帮助大家快速掌握知识,了解企业要求。

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧