日期:2014-05-20  浏览次数:21040 次

Entity Framework 怎么放弃错误数据
Entity Framework 怎么放弃错误数据?

程序中我声明了一个DbContext,然后向其中添加了一些数据,这些数据可能不太符合数据库要求,
在调用SaveChanges时,就会有Exception。

这时再向这个DbContext中添加正确的数据,并调用SaveChanges时,会一直有Exception;

怎样才能丢弃第一步中引起Exception的数据,让第二步的正确数据可以正常SaveChange呀??

------解决方案--------------------
使用ObjectContext.Refresh()可以重置当前的EntitySet。
方法说明参见:http://msdn.microsoft.com/zh-cn/library/bb896255.aspx

这是我学习LINQ to Entity时的笔记:http://www.cnblogs.com/Abbey/archive/2011/07/31/2122780.html
------解决方案--------------------
这些数据可能不太符合数据库要求,

没有进行验证和格式处理么?
数据库操作之前进行验证和处理
------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/dd395500.aspx
最好是在插入前对数据进行相关格式验证
------解决方案--------------------
恩,用DetachOject可以去掉不想更新的数据,当然你得持有该数据的引用。
再多次操作之后,引用又没有保持的情况下,可以用Refresh来放弃客户端的数据,当然这样做相当于重新查询。

利用 ObjectContext.Refresh 方法,Refresh 第一参数是一个枚举:
1) RefreshMode.StoreWins 表示放弃本地数据,接受DB的数据。
2) RefreshMode.ClientWins 表示继续保持当前的数据,直到调用SaveChanges() 以当前数据更新到DB。
C# code

var confirmReject = MessageBox.Show("放弃所有修改?", "Confirm", MessageBoxButtons.OKCancel);  
if (confirmReject == System.Windows.Forms.DialogResult.OK)  
{  
    northwind.Refresh(RefreshMode.StoreWins, northwind.Customers);  
    northwind.AcceptAllChanges();  
}

------解决方案--------------------
System.Data.Common.DbTransaction tran = null;
try
{
 DBContext.Connection.Open();
 tran = DBContext.Connection.BeginTransaction();
.....
DBContext.SaveChanges();
tran.Commit();
}
catch (Exception ex)
{
if (tran != null)
tran.Rollback();
throw ex;
}

------解决方案--------------------
C# code
 db.Product.Attach(item);
                db.ObjectStateManager.ChangeObjectState(item, EntityState.Added);