使用IDal <t>接口</t>包装EntityFrameWork

时间:2012-10-25 09:04:40

标签: c# .net entity-framework architecture

我想将EntityFrameWork课程与仅IDal<T>的{​​{1}}界面打包在一起。

我想创建与每个实体对应的BL数据模型

如果我有CRUD operations,我会创建TempEntity和界面TempBlObj

是否有任何指导来完成此类任务?

我在实施IDal<TempBlObj>

时遇到了问题

因为实体中的保存是通过以下方式完成的:

Save(TempBlObj)

并且继续对实体引用进行了更改。

任何解决方案?

更新

我正在做这一切以模拟我的mDbEntities.SaveChanges();界面

例如,为了更改TempEntity.status

我必须创建一个具体方法IDal<T>而不是通用ChangeStatus()CRUD

因为保存实体就像

一样

Save(BlObj item)

..take reference to some entity, do some change..

我尝试添加BlObjects以放松Bl和具体EntityFW之间的依赖关系

更多一般:

使用ORM时,使用mMamDbEntities.SaveChanges(); intreface(IDal<T>操作)处理松散炮弹的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

保存实体的责任不应该是实体本身的工作。这是个坏主意。 您可以考虑在您的情况下实施repository pattern

答案 1 :(得分:0)

在为我的系统规划存储库时,我会记住几个事实:

  • O / RM可以帮助我实现存储不知情的实体。这意味着我不专门划分业务实体和数据库实体。我有一个User实体 - 无论如何,ORM都应该坚持下去,而且我不会在这里引入额外的图层。

  • 我从限制较少的界面开始:

     
    interface IDal {
        T Get<T>(id);
        void Save(object o); //or T, if needed
        IQueryable<T> Query<T>();
    }

  • 而且 - 它可以被嘲笑得很好(使用Moq的样本)。
     
    var users = new List<User>(){ /* Users here */}
    var mockedRepository = new Mock<IRepository>();

    //getup GET
    mockedRepository.Setup(
        self => self.Get<User>( It.IsAny<int>() )
    .Returns( (int id) => _users.First(u => u.Id == id) );