Asp.net mvc 3 使用Automapper/EF CodeFirst更新数据库

Asp.net mvc 3 使用Automapper/EF CodeFirst更新数据库,asp.net-mvc-3,ef-code-first,automapper,Asp.net Mvc 3,Ef Code First,Automapper,我在我的MVC/EF代码第一个项目中使用Automapper。将ViewModel映射到View时,我使用的是从TypeConverter继承的customer转换器类。我正在使用以下代码设置映射: Mapper.CreateMap<CustomerViewModel, Customer>().ConvertUsing<CustomerConverter>(); Mapper.CreateMap().ConvertUsing(); 其中CustomerConverte

我在我的MVC/EF代码第一个项目中使用Automapper。将ViewModel映射到View时,我使用的是从TypeConverter继承的customer转换器类。我正在使用以下代码设置映射:

Mapper.CreateMap<CustomerViewModel, Customer>().ConvertUsing<CustomerConverter>();
Mapper.CreateMap().ConvertUsing();
其中CustomerConverter是我的TypeConverter类

在创建新的客户实体并保存到db时,这种方法可以很好地工作

Customer customer = Mapper.Map<CustomerViewModel, Customer>(viewModel);
dbEntities.Customer.Add(customer);
dbEntities.SaveChanges();
Customer=Mapper.Map(viewModel);
dbEntities.Customer.Add(客户);
dbEntities.SaveChanges();
但在编辑现有客户时,我发现对客户对象的更改没有保存

我用来处理现有客户更新的代码如下

var customer = dbEntities.Customer.Single(a => a.CustomerId == viewModel.CustomerId.Value);
Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()).ConvertUsing<ExistingCustomerConverter>();
Mapper.Map<ExistingCustomerViewModel, Customer>(viewModel, customer);
dbEntities.Entry(customer).State = EntityState.Modified;
dbEntities.SaveChanges();
var customer=dbEntities.customer.Single(a=>a.CustomerId==viewModel.CustomerId.Value);
Mapper.CreateMap().formMember(dest=>dest.CustomerId,opt=>opt.Ignore()).ConvertUsing();
Mapper.Map(视图模型,客户);
dbEntities.Entry(customer.State=EntityState.Modified;
dbEntities.SaveChanges();
我使用不同的viewmodel和customer converter来处理现有客户,因为我只显示有限的字段来更新现有客户

问题是,使用上述代码时,客户记录没有更新。 我发现,如果我删除自定义转换,客户记录就会更新

i、 e

Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()); 
Mapper.CreateMap().formMember(dest=>dest.CustomerId,opt=>opt.Ignore());
工作正常,但我失去了应用自定义映射的能力

我错过什么了吗?谢谢你的帮助


谢谢!巴拉

我终于决定改变我的方法。已经阅读了下面的文章 我决定只对实体到视图模型的映射使用Automapper。在HttpPost事件期间,我手动将视图模型中的属性分配给实体。当然,它使我的代码非常庞大,但它确实让我能够控制进入数据库的内容。 干杯
Bala

作为旁注,
Mapper.CreateMap
静态方法应该在每个AppDomain中只调用一次,最好是在应用程序启动时调用,而不是每次映射时调用。感谢Darin提供的提示,是的,我将所有CreateMap代码存储在静态类的静态方法中,并在应用程序启动时调用静态方法。希望这是最好的做法。