Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用IDal包装实体框架<;T>;界面_C#_.net_Entity Framework_Architecture - Fatal编程技术网

C# 用IDal包装实体框架<;T>;界面

C# 用IDal包装实体框架<;T>;界面,c#,.net,entity-framework,architecture,C#,.net,Entity Framework,Architecture,我想用IDal接口包装我的EntityFrameWork类,只使用CRUD操作 我想创建对应于每个实体的BL数据模型 意思是如果我有TempEntity我将创建TempBlObj和接口IDal 完成这项任务有什么指导意义吗 我在实现Save(TempBlObj) 由于实体中的保存由以下人员完成: mdbenties.SaveChanges() 这取决于对实体引用所做的更改 有什么解决办法吗 更新 我这么做是为了模仿我的IDal界面 例如,为了更改TempEntity.status 我必须创建一个

我想用
IDal
接口包装我的
EntityFrameWork
类,只使用
CRUD操作

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

意思是如果我有
TempEntity
我将创建
TempBlObj
和接口
IDal

完成这项任务有什么指导意义吗

我在实现
Save(TempBlObj)

由于实体中的保存由以下人员完成:

mdbenties.SaveChanges()

这取决于对实体引用所做的更改

有什么解决办法吗

更新

我这么做是为了模仿我的
IDal
界面

例如,为了更改TempEntity.status

我必须创建一个具体的方法
ChangeStatus()
,而不是通用的
CRUD
Save(BlObj项)

与实体一起保存的操作如下

。引用某个实体,进行一些更改。

mmamdbenties.SaveChanges()

我试图添加BlObjects,以放松Bl和具体实体fw之间的依赖关系

更一般:


在使用ORM时,使用
IDal
intreface(
CRUD
操作)的最佳实践是什么?

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

在为我的系统设计一个存储库时,我想记住的几个事实是:

  • O/RM有助于我实现存储实体。这意味着我没有专门划分业务实体和数据库实体。我有一个
    用户
    实体,ORM应该保持它,不管怎样,我不打算在这里介绍额外的层

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


界面线{
T获取(id);
void Save(对象o);//或T,如果需要
IQueryable查询();
}
  • 而且-可以很好地模拟(使用最小起订量的样本)

var users=new List(){/*此处的用户*/}
var mockedRepository=new Mock();
//打扮
mockedRepository.Setup(
self=>self.Get(It.IsAny())
.Returns((int id)=>_users.First(u=>u.id==id));

我认为您将与框架作斗争!我认为您必须明确地分离所有其他实体才能实现这一点。您真的需要它以这种方式工作吗?它是用于单元测试的。否则您会怎么做?我很难准确地想象您正试图做什么,更多的上下文可能会有所帮助。虽然我可以看到其中的优点考虑到DAL(即EntityFramework),这将用于隔离单元测试的代码是一个相当已知的数量,在您的测试设置中,让单元测试运行在真实的DAL上,并创建测试DB实例等不是更实用吗?您将如何模拟EntityFW?它是用于单元测试的。否则您将如何做?我在实现Save(TempBlObj)时遇到问题因为实体中的保存是由:mdbenties.SaveChanges()完成的,而这依赖于对实体引用所做的更改。“保存实体的责任不应该是实体本身的工作。”-可以。这种模式是“ActiveRecord”或“Row Gateway”但对于EF,T是一个具体的DBEntity项。否?那么context.SaveChanges()将如何工作?它依赖于EF DTO上的更改检测,否?
     
    interface IDal {
        T Get<T>(id);
        void Save(object o); //or T, if needed
        IQueryable<T> Query<T>();
    }

     
    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) );