使用EF6,您可以使用以下新事务:
using (var context = new PostEntityContainer())
{
using (var dbcxtransaction = context.Database.BeginTransaction())
{
try
{
PostInformation NewPost = new PostInformation()
{
PostId = 101,
Content = "This is my first Post related to Entity Model",
Title = "Transaction in EF 6 beta"
};
context.Post_Details.Add(NewPost);
context.SaveChanges();
PostAdditionalInformation PostInformation = new PostAdditionalInformation()
{
PostId = (101),
PostName = "Working With Transaction in Entity Model 6 Beta Version"
};
context.PostAddtional_Details.Add(PostInformation);
context.SaveChanges();
dbcxtransaction.Commit();
}
catch
{
dbcxtransaction.Rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当事情横盘整理时,实际上需要回滚吗?我很好奇,因为提交描述说:"提交基础商店交易."
而回滚描述说:"回滚基础商店交易."
这让我感到很好奇,因为在我看来,如果没有调用Commit,先前执行的命令将不会被存储(这对我来说似乎是合乎逻辑的).但如果是这种情况,那么调用Rollback函数的原因是什么?在EF5中我使用了TransactionScope,它没有回滚功能(只有一个完整的),这对我来说似乎是合乎逻辑的.由于MS …
c# sql-server entity-framework transactions entity-framework-6
什么之间的区别,_context.SaveChanges并且_context.AcceptAllChanges(),是AcceptAllChanges()有几分重装数据库数据或回滚(丢弃)由用户做出的时候,他并没有使用变化SaveChanges()
如何在Entity Framework中使用事务?我在Stackoverflow上阅读了一些链接:使用Transactions或SaveChanges(false)和AcceptAllChanges()?
但; 我有3个表,所以我有3个实体:
CREATE TABLE Personel
(PersonelID integer PRIMARY KEY identity not null,
Ad varchar(30),
Soyad varchar(30),
Meslek varchar(100),
DogumTarihi datetime,
DogumYeri nvarchar(100),
PirimToplam? float);
Go
create TABLE Prim
(PrimID integer PRIMARY KEY identity not null,
PersonelID integer Foreign KEY references Personel(PersonelID),
SatisTutari int,
Prim float,
SatisTarihi Datetime);
Go
CREATE TABLE Finans
(ID integer PRIMARY KEY identity not null,
Tutar float);
Run Code Online (Sandbox Code Playgroud)
Personel,Prim,Finans我的桌子.如果你看Prim表你可以看到Prim值浮点值如果我写一个文本框而不是浮点值我的事务必须运行.
using (TestEntities testCtx = new TestEntities())
{
using (TransactionScope scope = new TransactionScope())
{
// do …Run Code Online (Sandbox Code Playgroud) .net c# entity-framework visual-studio-2010 visual-studio-2008
我正在使用实体框架实现DAL.在我们的应用程序中,我们有三个层(DAL,业务层和演示文稿).这是一个网络应用程序.当我们开始实现DAL时,我们的团队认为DAL应该有类,其方法接收业务层上的服务给出的ObjectContext并对其进行操作.这个决定背后的基本原理是不同的ObjectContexts看到不同的DB状态,因此由于外键匹配和其他不一致的问题,一些操作可能被拒绝.
我们注意到从服务层生成和传播对象上下文会在层之间产生高耦合.因此,我们决定使用由Automapper映射的DTO(不是非托管实体或自我跟踪实体,主张高耦合,将实体暴露给上层和低效率)和UnitOfWork.所以,这是我的问题:
如果可能的话,请提供支持您答案的参考书目.
关于目前的设计:
该应用程序计划在三个层次上开发:演示,业务和DAL.业务层有外观和服务
有一个名为ITransaction的接口(只有两种处理和保存更改的方法)仅在服务中可见.为了管理事务,有一个类Transaction,它扩展了ObjectContext和ITransaction.我们已经设计了这一点,考虑到在业务层我们不希望其他ObjectContext方法可访问.
在DAL上,我们使用两个泛型类型创建了一个抽象存储库(一个用于实体,另一个用于其关联的DTO).此存储库具有以通用方式实现的CRUD方法和两个通用方法,以使用AutoMapper映射通用存储库的DTO和实体.抽象存储库构造函数将ITransaction作为参数,并且它期望ITransaction是ObjectContext,以便将其分配给其检测到的ObjectContext属性.
具体的存储库应该只接收和返回.net类型和DTO.
我们现在面临这个问题:创建的泛型方法不会为附加实体生成临时或持久ID(直到我们使用SaveChanges(),因此打破了我们想要的事务性); 这意味着服务方法无法使用它来关联BL中的DTO
c# design-patterns data-access-layer .net-4.0 entity-framework-4
我想同时转换一些表.如果一个人不成功,必须全部回滚.
像这样的东西:
ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
Run Code Online (Sandbox Code Playgroud)
但问题是,我不知道如何使用交易.
我试着这个:
using (gasstationEntities ctx = new gasstationEntities(Resources.CONS))
{
ctx.Database.Connection.Open();
DbTransaction tr = ctx.Database.Connection.BeginTransaction();
try
{
ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
//commit the transaction
tr.Commit();
new MessageWindow(this, Resources.GetString("Warn"), Resources.GetString("DeleteSuccess"));
}
catch (Exception ex)
{
//return
tr.Rollback();
}
//close
ctx.Database.Connection.Close();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题: tr.Commit();
和Exception告诉我:
{System.InvalidOperationException: Connection must be valid and open to rollback transaction
Run Code Online (Sandbox Code Playgroud)
而tr.Rollback();抛出异常.例外是:
{System.InvalidOperationException: Connection must …Run Code Online (Sandbox Code Playgroud) c# mysql entity-framework entity-framework-5 visual-studio-2012
这是使用事务或SaveChanges(false)和AcceptAllChanges()的后续问题?
特别关于这一行 context2.SaveChanges(false);
现在不推荐使用SaveChanges(bool).我们应该使用SaveChanges(SaveOptions)代替.
该SaveOptions有以下选项:
哪些映射到SaveChanges(false)?
我有一个问题,我想分享.上下文有点乱,所以我会尽力在解释中.
我需要在许多实体上创建一个事务操作.我正在使用EF CodeFirst但使用遗留数据库,我无法更改.为了创建比数据库提供的更一致的模型,我将数据库信息投射到我自己创建的更精细的实体中.
由于我需要使用不同的上下文,我最初的想法是使用TransactionScope,它在过去给了我很好的结果.为什么我需要不同的背景?由于db的各种问题,我无法仅在一个操作(UnitOfWork)中进行更新.我需要检索仅在SaveChanges()之后出现的不同ID.
using (var scope = new TransactionScope())
{
Operation1();
Operation2();
Operation3(uses ExecuteStoreCommand)
SaveChanges();
Operation4();
SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我知道,为了使用TransactionScope,我需要在所有操作之间共享相同的连接(我正在这样做,将上下文传递给对象).但是,当我执行其中一个操作(使用ExecuteStoreCommand)或我尝试在第一个SaveChanges之后进行一些更新时,我总是收到MSDTC错误(对分布式事务的支持被禁用),甚至更罕见,作为卸载域.
我不知道是否有人可以帮助我,至少知道这是这个场景的最佳方向.
非常感谢,
Say Table1是一个包含两列的表.Table1ID和名称.
如果我执行以下代码...
var Obj1 = new Table1();
Obj1.Name = "hello"
TestDBEntities.AddToTable1(Obj1);
var currObj = Table1.Where(o => o.Name.Contains("hello")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
currObj将返回null.
但是,如果我这样做
var Obj1 = new Table1();
Obj1.Name = "hello"
TestDBEntities.AddToTable1(Obj1);
**TestDBEntitles.SaveChanges();**
var currObj = Table1.Where(o => o.Name.Contains("hello")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
然后currObj将返回我创建的第一个对象.这是因为该对象在数据库中.
我正在创建一个大型批处理进程,我不希望将所有内容保存到数据库直到最后.但是,我必须进行检查,例如确保某个对象尚未添加等,这需要我在将这些对象保存到数据库之前引用它们.
是否可以在Entity Framework中进行LINQ查询,该查询可以识别内存中尚未保存到数据库的对象.
我试图实现一种只有在没有错误发生时才将数据(实体对象)放入数据库的方法('所有').如果发生错误,则不会在数据库中创建任何内容("或什么都没有").我称之为"一切或全无".
问题是我必须创建依赖于其他实体的实体.这是一个例子:
0)我创建了一个上下文
DBContext ctx = new DBContext();
Run Code Online (Sandbox Code Playgroud)
1)我创建一个Invoice实体对象并将其添加到上下文中:
Invoice inv1 = new Invoice();
inv1 .Number = "Invoice-2546432";
if(!ctx.Invoice.Exists(i => i.Number == "Invoice-2546432")) // problem n°1
ctx.AddObject(inv1 );
else
throws new Exception('blah blah');
Run Code Online (Sandbox Code Playgroud)
2)发票上有发票行:
InvoiceLine line = new InvoiceLine();
line .ID_INVOICE = in1.ID; // problem n°2
line .Label = "Line 1";
line .Ammount = 5.3;
ctx.AddObject(line );
Run Code Online (Sandbox Code Playgroud)
3)最后:
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
所以,如果一切顺利,我会有这样的事情:
Table INVOICE
=====================
ID | NUMBER
_____________________
0 | Invoice-2454876
_____________________
1 | Invoice-2487432
_____________________
2 | Invoice-2546432
Table INVOICE_LINE …Run Code Online (Sandbox Code Playgroud) 我在我的asp.net mvc web应用程序中有以下方法,我使用Ado.net实体框架来映射我当前的数据库表: -
public void changeDeviceSwitch(int fromID , int toID)
{
var currentdevices = tms.TMSSwitchPorts.Where(a => a.SwitchID == fromID);
foreach (var d in currentdevices)
{
tms.TMSSwitchPorts.Remove(d);
}
foreach (var d in currentdevices)
{
TMSSwitchPort tsp = new TMSSwitchPort()
{ SwitchID = toID,
TechnologyID = d.TechnologyID,
PortNumber = d.PortNumber };
tms.TMSSwitchPorts.Add(d);
}
tms.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我的上述方法将在数据库中生成多个删除和添加操作.所以说它会导致5个删除操作和5个插入操作,在这种情况下会调用我的情况下的SaveChangies(),将10个操作包装在一个数据库事务中?所以要么所有的更改都发生了,要么都没有?谢谢
c# ×6
transactions ×3
.net ×2
linq ×2
.net-4.0 ×1
asp.net ×1
asp.net-mvc ×1
c#-4.0 ×1
mysql ×1
sql-server ×1