Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 将数据从ViewModel传递到DataModel_C#_Entity Framework_Asp.net Mvc 5 - Fatal编程技术网

C# 将数据从ViewModel传递到DataModel

C# 将数据从ViewModel传递到DataModel,c#,entity-framework,asp.net-mvc-5,C#,Entity Framework,Asp.net Mvc 5,我正在努力更好地学习C#和MVC,我正在做一个项目来帮助我做到这一点。作为其中的一部分,我正在尝试创建一个用户注册并登录到我的网站。我正在使用实体框架,并试图遵循我所知道或遇到的所有最佳实践,我想我有点混淆了一些事情 我创建了一个表示层、一个数据层和一个业务层。这基本上给我留下了一个问题,因为我不能做看起来很明显的事情,因为这将是一个循环依赖,而且这是一件坏事,不管怎样,我想知道我是否以正确的方式来做这件事 在我的表示层中,我放置了ViewModel和Controller 在我的数据层中,是我所

我正在努力更好地学习C#和MVC,我正在做一个项目来帮助我做到这一点。作为其中的一部分,我正在尝试创建一个用户注册并登录到我的网站。我正在使用实体框架,并试图遵循我所知道或遇到的所有最佳实践,我想我有点混淆了一些事情

我创建了一个表示层、一个数据层和一个业务层。这基本上给我留下了一个问题,因为我不能做看起来很明显的事情,因为这将是一个循环依赖,而且这是一件坏事,不管怎样,我想知道我是否以正确的方式来做这件事

在我的表示层中,我放置了ViewModel和Controller

在我的数据层中,是我所有的EF类和模型

我也有一个BusinessLayer,但这里还没有任何东西(还不是100%应该放在这里的东西)

我的表示层显然依赖于我的数据层,但将数据从PresentationLayer中的ViewModel传递回数据层中的数据模型以更新数据库的最佳方式是什么?在视图中,用户将基本上输入登录信息,然后需要将其发送到数据层中的my Entity,然后使用Entities EF访问数据库。我不能将表示层作为依赖项添加到数据层,因为这会创建循环依赖项

我读过关于automapper的文章,但不确定这是否正确,或者这个逻辑应该放在哪里,应该放在模型中还是单独的类中,以及放在哪一层?我也尝试过用统一和依赖注入做一些事情,但我想我现在混淆了什么是真正需要的,以及如何将我正在阅读的内容应用到我真正想要做的事情上。我可以通过把所有的东西都放在一个项目中来实现这一点,但很明显,我正试图从设计的角度正确地做到这一点

在中从我的ViewModel传递数据的最佳方式是什么 PresentationLayer返回数据层中的数据模型进行更新 数据库

使用自动映射不会阻止我们产生循环依赖。只是为了方便我们把一个物体映射到另一个物体

只要我们不在数据层中实例化ViewModel类(我们不需要),就不会有循环依赖关系

示例是通过调用UserService将数据从ViewModel传递到DataModel

[HttpPost]
公共异步任务创建(UserCreateUpdateModel模型)
{
if(ModelState.IsValid)
{
var user=新用户
{
用户名=model.UserName,
FirstName=model.FirstName,
LastName=model.LastName
};
wait\u userService.AddUserAsync(用户);
返回重定向到操作(“列表”);
}
返回视图(“创建”,模型);
}

要将数据从视图传递到控制器,您有三个选项: 1.使用强模型类型 2.使用FormCollection对象(不推荐) 3.使用参数

下面是一个关于如何将参数从视图传递到控制器的好教程:


注意,这个类也使用依赖项注入。有很多不错的nuget套餐。我喜欢的是SimpleInjector。这将意味着你不是在“更新”服务,而是将它们注入,这将导致更多的可测试代码,我同意。我使用Autofac,但您可以使用任何IoC容器;它们都是很好的容器。上面的代码是可单元测试的——是实现,也是单元测试。是的,您的示例很棒……我刚刚指出了依赖注入(DI)和控制反转(IoC)的使用,感谢Win的澄清。我想我有时会混淆所有不同的概念。
[HttpPost]
public async Task<ActionResult> Create(UserCreateUpdateModel model)
{
   if (ModelState.IsValid)
   {
      var user = new User
      {
         UserName = model.UserName,
         FirstName = model.FirstName,
         LastName = model.LastName
      };

      await _userService.AddUserAsync(user);
      return RedirectToAction("List");
    }
    return View("Create", model);
}