相关疑难解决方法(0)

使用Transactions或SaveChanges(false)和AcceptAllChanges()?

我一直在研究交易似乎因为我通过他们照顾自己的EF只要falseSaveChanges(),然后调用AcceptAllChanges(),如果没有错误:

SaveChanges(false);
// ...
AcceptAllChanges();
Run Code Online (Sandbox Code Playgroud)

如果事情变坏怎么办?我不必回滚,或者一旦我的方法超出范围,交易结束了吗?

在事务中途分配的任何indentiy列会发生什么?我认为如果其他人在我的事情发生之前添加了一条记录,那么这意味着会有一个缺失的身份值.

有没有理由TransactionScope在我的代码中使用标准类?

c# entity-framework transactions

340
推荐指数
2
解决办法
27万
查看次数

如果您不将事务提交到数据库(例如,SQL Server)会发生什么?

假设我有一个查询:

begin tran
-- some other sql code
Run Code Online (Sandbox Code Playgroud)

然后我忘了提交或回滚.

如果另一个客户端尝试执行查询,会发生什么?

sql-server transactions commit

100
推荐指数
4
解决办法
12万
查看次数

在实体框架中调用多个SaveChanges

我正在构建我自己的自定义存储库,基于实体框架,我正在创建一些扩展方法,允许我将部分视图模型保存为实体模型,因此我正在构建自己的添加和更新方法.

目前,每个方法都有来自DbContext的SaveChanges(),在末尾调用,这意味着每个模型都会调用一个调用.

我正在为MVC4站点构建这个基本DAL模式,这意味着大多数时候我将访问1个模型,但事实并非必须如此.

在更新即3个实体时为每个模型调用SaveChanges()是不是太糟糕的做法,还是应该先将所有内容添加到对象上下文中,而不是将SaveChanges()作为某种事务提交?

transactions transactionscope entity-framework-4

25
推荐指数
2
解决办法
4万
查看次数

DbContextTransaction回滚

实体框架6引入了一种使用BeginTransaction方法支持DbContext中的事务的新方法:

var db = new MyDbContext();
using(var tx = db.Database.BeginTransaction())
{
    // update entities
    try
    {
        db.SaveChanges();
        tx.Commit();
    }
    catch(Exception)
    {
        tx.Rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否需要在方法中调用Rollback()?如果没有在异常中调用会发生什么?我知道在使用TransactionScope时,它将在处理时自动回滚事务并且不调用Complete.DbContextTransaction的行为是否相似?

entity-framework

24
推荐指数
1
解决办法
3288
查看次数

实体框架6异步操作和TranscationScope

我在stackoverflow上搜索但找不到类似的问题,请指出我是否有一个问题.

我试图用同步和异步操作实现一个通用的可重用存储库,但是我对实体框架和工作单元的了解很少,我很难找到实现它的正确方法.

我在SaveAndCommit操作中添加了一些变体,但不知道使用事务和异步执行此操作的最佳方法是什么.

- - 编辑 - -

根据我的理解,当执行多个操作时应该使用事务,但出于理解目的,我将它用于一个操作.(如果我错了,请纠正我)

这就是我到目前为止所做的

public class Service<TEntity> : IService<TEntity>
    where TEntity : Entity
{
    #region Constructor and Properties

    UnitOfWork _unitOfWork { get { return UnitOfWork.UnitOfWorkPerHttpRequest; } }

    protected DbSet<TEntity> Entities
    {
        get { return _unitOfWork.Set<TEntity>(); }
    }

    #endregion Constructor and Properties


    #region Operations

    public virtual IQueryable<TEntity> QueryableEntities()
    {
        return Entities;
    }

    public virtual async Task<IList<TEntity>> WhereAsync(Expression<Func<TEntity, bool>> predicate)
    {
        return await Entities.Where(predicate).ToListAsync();
    }

    public virtual IList<TEntity> Where(Expression<Func<TEntity, bool>> predicate)
    {
        return Entities.Where(predicate).ToList();
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework transactionscope async-await

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

值不能为null:测试数据库时的连接

我正在尝试使用Entity Framework 6为我的ASP.NET MVC应用程序运行集成测试.

我得到的错误是

System.Data.Entity.Core.EntityException:基础提供程序在Rollback上失败.---> System.ArgumentNullException:Value不能为null.
参数名称:连接

代码如下所示:

Database.SetInitializer(new PrimaryInitializerTest());
_context = new PrimaryContextTest();
_context.Database.Initialize(true);

using (var dbt = _context.Database.BeginTransaction())
{
     dbt.Commit();
     dbt.Rollback();
}
Run Code Online (Sandbox Code Playgroud)

我也尝试dbt.UnderlyingTransaction.Connection.Open()在using语句dbt.UnderlyingTransaction.Connection.Close()下方进行调用,并在调用之下调用Rollback().这给了我错误Connection is not closed.

PrimaryInitializerTest

protected override void Seed(PrimaryContextTest context)
{
    // (...) Input some values
    base.Seed(context);
}
Run Code Online (Sandbox Code Playgroud)

PrimaryContextTest

public class PrimaryContextTest : DbContext
{
    public PrimaryContextTest() : base("PrimaryContextTest")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<PrimaryContextTest>());
    }

    public DbSet<Story> Stories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) …
Run Code Online (Sandbox Code Playgroud)

c# sql-server asp.net-mvc entity-framework-6

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