我使用的是数据库优先( Database )方法,我想使用我自己的验证--我试图修改生成的模型,它可以:
但是,如果我需要从DB更新模型,我的验证代码当然会覆盖实体数据模型,属性就会消失。如何通过自己的验证来克服这种情况呢?
因此,我最后所做的是在同一个名称空间中创建了一个名称空间,并命名了ClientViewModel,在这个类中,我进行了所有的自定义验证及其工作,直到我尝试保存并得到以下错误:
'System.Data.Entity.DbSet.Add(myapp.Models.Client)‘的最佳重载方法匹配有一些无效的参数
这里是我的控制器,看起来像:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ClientViewModel client)
{
if (ModelState.IsValid)
{
try
{
using (var context = new db_entities())
{
//more code...
db.Clients.Add(client); //<<<ERROR
db.SaveChagnes();
}
}
}
}发布于 2015-01-31 16:08:59
我最终使用了AutoMapper,这是一种不使用AutoMapper的繁琐情况--它不仅减少了工作量,而且限制了执行这么多行所占用的执行时间。
以下是我更新的代码:
Client clientModel = Mapper.Map<ClientViewModel, Client>(client);
db.Clients.Add(clientModel);发布于 2015-01-30 23:18:00
您需要将视图模型转换为EF跟踪的模型类。假设您的ViewModel和Model都有3个属性x、y和z,您可以看到如下所示:
public Client ConvertViewModelToModel(ClientViewModel vm)
{
return new Client ()
{
x = vm.x,
y = vm.y,
z = vm.z
};
}然后调用它来转换视图模型:
var clientModel = ConvertViewModelToModel(vm);然后,您可以继续将这个clientModel添加到db.Clients集合中,然后继续保存它。
发布于 2015-06-07 02:27:06
检查要正确创建的数据库。如果没有,那就试试:
>Enable-migrations
>add-migration model
>update-database也许可以通过这个解决。我试过了解决了我的问题。
https://stackoverflow.com/questions/28245182
复制相似问题