标签: unit-of-work

7
推荐指数
2
解决办法
2036
查看次数

N层应用程序中的多个DbContexts

我正在创建我的第一个N-Tier MVC应用程序,并且我遇到了如何DbContexts使用我的数据库第一种方法来管理多个的路障.

我有以下几层

Presentation
Service (WCF)
Business
Data Access
Run Code Online (Sandbox Code Playgroud)

我不想在我的服务层中使用实体框架引用,但是我没有看到如何创建接口或管理两个上下文的东西.我让它在IDatabaseFactory中使用单个上下文,但我似乎无法找到管理两个的方法.

下面是我UnitOfWork在我的服务ctor中创建的,但我看待它的每一种方式我仍然依赖于它SiteModelContainer,而实际上我有另一个上下文.

public class UnitOfWork : IUnitOfWork
    {
        private SiteModelContainer _context;

        private readonly IDatabaseFactory _databaseFactory;

        protected SiteModelContainer SiteContext
        {
            get { return _context ?? (_context = _databaseFactory.Get()); }
        }

        public UnitOfWork(IDatabaseFactory factory)
        {
            _databaseFactory = factory;
            _context = _databaseFactory.Get();
        }
        //More code
    }



public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private SiteModelContainer _dataContext;

    public SiteModelContainer Get()
    {
        return _dataContext ?? (_dataContext = new SiteModelContainer());
    } …
Run Code Online (Sandbox Code Playgroud)

c# repository unit-of-work entity-framework-4.1 dbcontext

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

实体框架4 - 在哪里放置"ApplyCurrentValues"逻辑?

我正在使用" 存根技术 "来更新我的POCO(用于分离的上下文,ASP.NET MVC).

这是我目前在我的控制器中的代码(可以工作):

[HttpPost]
public ActionResult Edit(Review review)
{
   Review originalReview = _userContentService.FindById(review.PostId) as Review;
   var ctx = _unitOfWork as MySqlServerObjectContext;
   ctx.ApplyCurrentValues("MyEntities.Posts", review);
   _unitOfWork.Commit();
   // ..snip - MVC stuff..
}
Run Code Online (Sandbox Code Playgroud)

如你所见,到处都有代码味道.:)

几点:

  1. 我基本上都使用依赖注入(基于接口)
  2. 我使用工作单元模式来抽象ObjectContext并在多个存储库之间提供持久性
  3. 目前我的IUnitOfWork接口只有一个方法:void Commit();
  4. 控制器拥有IUserContentServiceIUnitOfWork通过DI注入
  5. IUserContentServiceFind在存储库中调用,使用ObjectContext.

这些是我不喜欢上面代码的两件事:

  1. 我不想将IUnitOfWork转换MySqlServerObjectContext.
  2. 我不希望Controller需要关心 ApplyCurrentValues

我基本上希望我的代码看起来像这样:

[HttpPost]
public ActionResult Edit(Review review)
{
   _userContentService.Update(review);
   _unitOfWork.Commit();
   // ..snip - MVC stuff..
}
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么能这样做?(或类似的东西).

我已经很聪明地根据类型(泛型,复数的组合)来计算实体集名称,所以不要过于担心.

我不知道放在哪里最好的地方 …

c# design-patterns unit-of-work entity-framework-4

6
推荐指数
1
解决办法
7735
查看次数

EF4与MVC3 - 我需要存储库模式吗?

我最近了解了存储库和工作单元设计模式,并认为我将在新的EF4 MVC3项目中实现它们,因为抽象通常很好.

当我将它们添加到项目中时,我想知道果汁是否值得谚语挤压,给出以下内容:

  • 基础数据访问机制从EF4改变的可能性极小.
  • 这种抽象级别将需要更多的开销/混淆项目和团队中的其他开发人员.

我看到使用Repository模式的唯一真正好处是单元测试应用程序.抽象出数据存储似乎并不有用,因为我知道数据存储区不会改变,而且,EF4已经提供了一个非常好的抽象(我只是调用.AddObject(),它看起来像我在修改内存中集合,我只是调用.SaveChanges()已经提供了工作单元模式).

我是否应该费心实施这种抽象?我觉得必须有一些我遗漏的巨大好处,但我觉得我不需要沿着这条路走下去.我愿意相信; 有人可以提起诉讼吗?谢谢.

entity-framework unit-of-work repository-pattern asp.net-mvc-3

6
推荐指数
1
解决办法
4078
查看次数

如何在ASP.NET MVC 3中更新复杂模型

我试图在单个视图中更新复杂模型.我正在使用ASP.NET MVC3,Entity Framework with Code first,工作单元,通用存储库模式..但是当我尝试更新模型时,我想出了这个错误:

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致.

这是我的简化视图模型:

public class TransactionViewModel
{
     public Transaction Transaction { get; set; }
     public bool IsUserSubmitting { get; set; }
     public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的简化复杂模型,并作为其导航属性之一的示例.Transaction与其所有导航属性具有一对一的关系:

public class Transaction
{
    [Key]
    public int Id { get; set; }

    public int CurrentStageId { get; set; }

    public int? BidId { get; set; }

    public int? EvaluationId { get; set; }

    public virtual Stage CurrentStage { get; set; }

    public virtual Bid Bid …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc entity-framework unit-of-work ef-code-first

6
推荐指数
1
解决办法
6077
查看次数

使用Autofac在WCF服务中实现工作单元

如何使用Autofac在WCF服务中实现工作单元模式?

使用Autofac的wcf集成,可以轻松地将每个调用(或Autofac术语LifetimeScope)工作接口单元中的相同实例注入到我的服务和存储库中 - 我所遵循的是在返回WCF服务时提交工作单元更改的方法如果没有任何例外,显然只会打电话.

我已经看到使用自定义端点行为与WCF和Autofac,这基本上是我开始,但不处理异常.

目前我所拥有的是IOperationInvoker在Invoke中启动工作单元并仅在没有任何异常的情况下提交它.这种方法的问题是我需要在方法中解析我的工作单元实例,Invoke这给了我一个不同于注入我的服务和存储库的实例AutofacInstanceProvider.

wcf unit-of-work autofac

6
推荐指数
1
解决办法
1268
查看次数

将我的DbContext包装在Unit of Work类中是一个好主意吗?

我正在尝试在我的MVC Web应用程序中实现工作单元/存储库模式.

由于DbContext本身是一个工作单元,我想将它与我自己的UOW混合用于测试和解耦目的(将业务层与EF分离).那么将我的DbContext内部包装成如下所示的UOW类是一个好主意吗?

例:

为清晰起见,代码减少

public interface IUnitOfWork
{
    void Save();
}

public MyContext : DbContext
{
    // DbSets here
}

public UnitOfWork : IUnitOfWork
{
    public MyContext myContext { get; set; }

    void Save()
    {
        myContext.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我会调用UnitOfWork实例来执行数据操作.

非常感谢提前:-)

asp.net-mvc repository-design unit-of-work repository-pattern dbcontext

6
推荐指数
1
解决办法
934
查看次数

在UnitOfWork和Repository之间共享一个NHibernate会话

我正在尝试用NHibernate实现UnitOfWork和Repository模式.我正在寻找在工作单元实例和存储库实例之间共享会话的最佳方法.

最明显的方法ThreadStaticUnitOfWork课堂上介绍属性

public class UnitOfWork : IUnitOfWork
{
    public static UnitOfWork Current
    {
        get { return _current; }
        set { _current = value; }
    }
    [ThreadStatic]
    private static UnitOfWork _current;

    public ISession Session { get; private set; }

    //other code
}
Run Code Online (Sandbox Code Playgroud)

然后在Repository课堂上:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected ISession Session { get { return UnitOfWork.Current.Session; } }

    //other code
}
Run Code Online (Sandbox Code Playgroud)

但是我不喜欢上面列出的实现,并决定找到另一种方法来做同样的事情.

所以我带来了第二种方式:

public interface ICurrentSessionProvider : …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate repository unit-of-work autofac

6
推荐指数
1
解决办法
781
查看次数

如何在 Doctrine 中附加分离的实体?

我有一个脚本将循环中的一些“A”类型的新实体保存到数据库中。但是循环会抛出一些关闭 entityManager 的异常。所以必须重开。它导致应该与每个“A”实体连接的另一个“B”类型的实体与 unitOfWork 分离。如何将“B”附加到 unitOfWork?这是一个例子:

public function insert( Array $items )
{
    $B = $this->bRepository->findOneBy( ['name' => 'blog'] );
    $result = [ 'errors' => [], 'saved_items' => [] ];

    foreach( $items as $item )
    {
        try
        {
            $A = new Entity\A();
            $A->create([
                'name' => $item->name,
                'B' => $B // Here is the problem after exception. $B is detached.
            ]);
            $this->em->persist( $A );
            $this->em->flush( $A );
            $result['saved_items'][] = $item->name;
        } catch( \Eception $e )
        {
            $result['errors'][] = 'Item ' . …
Run Code Online (Sandbox Code Playgroud)

entity unit-of-work entitymanager detach doctrine-orm

6
推荐指数
1
解决办法
4287
查看次数

类应该同时实现 IAsyncDisposable 和 IDisposable 吗?

例如我有这个类:

public class UnitOfWork : IUnitOfWork
{
    private readonly ApplicationDbContext _context;

    public IProductRepository Products { get; private set; }
    public ICategoryRepository Categories { get; private set; }
    public IPhotoRepository Photos { get; private set; }

    public UnitOfWork(ApplicationDbContext context, IProductRepository productRepository,
        ICategoryRepository categoryRepository, IPhotoRepository photoRepository)
    {
        _context = context;
        Products = productRepository;
        Categories = categoryRepository;
        Photos = photoRepository;
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public Task<int> CompleteAsync()
    {
        return _context.SaveChangesAsync();
    }

    public void Dispose()
    {
        _context.Dispose();
    }

    public async …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection idisposable unit-of-work asp.net-core

6
推荐指数
1
解决办法
609
查看次数