相关疑难解决方法(0)

实体框架6事务回滚

使用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

73
推荐指数
3
解决办法
6万
查看次数

实体框架中的SaveChanges与AcceptAllChanges

什么之间的区别,_context.SaveChanges并且_context.AcceptAllChanges(),是AcceptAllChanges()有几分重装数据库数据或回滚(丢弃)由用户做出的时候,他并没有使用变化SaveChanges()

c# entity-framework

18
推荐指数
1
解决办法
2万
查看次数

如何在实体框架中使用交易?

如何在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

10
推荐指数
1
解决办法
9698
查看次数

DTO和UnitOfWork模式是一种为Web应用程序设计DAL的好方法吗?

我正在使用实体框架实现DAL.在我们的应用程序中,我们有三个层(DAL,业务层和演示文稿).这是一个网络应用程序.当我们开始实现DAL时,我们的团队认为DAL应该有类,其方法接收业务层上的服务给出的ObjectContext并对其进行操作.这个决定背后的基本原理是不同的ObjectContexts看到不同的DB状态,因此由于外键匹配和其他不一致的问题,一些操作可能被拒绝.

我们注意到从服务层生成和传播对象上下文会在层之间产生高耦合.因此,我们决定使用由Automapper映射的DTO(不是非托管实体或自我跟踪实体,主张高耦合,将实体暴露给上层和低效率)和UnitOfWork.所以,这是我的问题:

  1. 这是设计Web应用程序的DAL的正确方法吗?为什么?
  2. 如果对1回答"是",那么如何将DTO的概念与UnitOfWork模式相协调?
  3. 如果对"1"回答"否",这可能是为Web应用程序设计DAL的正确方法吗?

如果可能的话,请提供支持您答案的参考书目.

关于目前的设计:

该应用程序计划在三个层次上开发:演示,业务和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

10
推荐指数
1
解决办法
2569
查看次数

如何在EntityFramework 5中使用Transaction?

我想同时转换一些表.如果一个人不成功,必须全部回滚.

像这样的东西:

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

9
推荐指数
1
解决办法
2万
查看次数

实体框架 - 使用SaveChanges(SaveOptions)替换SaveChanges(bool)的事务

这是使用事务或SaveChanges(false)和AcceptAllChanges()的后续问题

特别关于这一行 context2.SaveChanges(false);

现在不推荐使用SaveChanges(bool).我们应该使用SaveChanges(SaveOptions)代替.

SaveOptions有以下选项:

  • 没有
  • AcceptAllChangesAfterSave
  • DetectChangesBeforeSave

哪些映射到SaveChanges(false)?

entity-framework transactions

8
推荐指数
1
解决办法
3208
查看次数

使用SaveChanges和ExecuteStoreCommand进行事务操作

我有一个问题,我想分享.上下文有点乱,所以我会尽力在解释中.

我需要在许多实体上创建一个事务操作.我正在使用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错误(对分布式事务的支持被禁用),甚至更罕见,作为卸载域.

我不知道是否有人可以帮助我,至少知道这是这个场景的最佳方向.

非常感谢,

ef-code-first c#-4.0 entity-framework-4.1

5
推荐指数
1
解决办法
3154
查看次数

是否有可能让Entity Framework识别已创建但尚未保存在数据库中的对象?

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查询,该查询可以识别内存中尚未保存到数据库的对象.

.net c# linq linq-to-entities entity-framework-4

4
推荐指数
1
解决办法
2299
查看次数

Linq/Entities:Everything or Nothing(在数据库中)

我试图实现一种只有在没有错误发生时才将数据(实体对象)放入数据库的方法('所有').如果发生错误,则不会在数据库中创建任何内容("或什么都没有").我称之为"一切或全无".

问题是我必须创建依赖于其他实体的实体.这是一个例子:

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)

linq asp.net entity-framework

4
推荐指数
1
解决办法
174
查看次数

Entity Framework中的SaveChanges是否会包装数据库事务中的所有更改

我在我的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个操作包装在一个数据库事务中?所以要么所有的更改都发生了,要么都没有?谢谢

asp.net-mvc entity-framework transactions asp.net-mvc-5

3
推荐指数
1
解决办法
829
查看次数