LINQ to SQL 不能与 Automapper 一起正常工作

LINQ to SQL does not work properly with Automapper

我已经使用 Automapper 很长时间了,没有任何困难,最近我一直在尝试将这个很棒的工具集成到我的 LINQ to SQl 框架中。我有以下代码:

using (var ps = new Promotionalsponsorship(constr))
{
   var applicationToSave = Mapper.Map<ApplicationModel, Application>(application);    

    if (applicationToSave.ApplicationId == default(int))
    {
        ps.Application.InsertOnSubmit(applicationToSave);
    }                

    ps.Application.Context.SubmitChanges();
 } 

我在这里尝试做的是 UPSERT 方法,我是说如果有 id = 0 的新记录,则插入或更新。有趣的是,当我像上面的代码那样使用 Automapper 更新上下文时,插入有效但 ps.Application.Context.SubmitChanges(); 不起作用。

现在,如果我使用如下简单的 属性 赋值更新上下文:

applicationToSave.Name = "Beautiful";
if (applicationToSave.ApplicationId == default(int))
{
    ps.Application.InsertOnSubmit(applicationToSave);
}
ps.Application.Context.SubmitChanges(); 

这个有效。我觉得 Automapper 对上下文对象做了一些事情,使其与数据库分离。我不知道。我怎样才能让它与 AutoMapper 一起工作?

更改跟踪仅适用于加载的实体。 Automapper 正在为您创建一个与 EF 完全无关的新对象——就代码而言,它只是一个普通对象。您需要执行以下操作:

using (var ps = new Promotionalsponsorship(constr))
{
    var applicationToSave = ps.Application.Find(application.ApplicationId);
    if (applicationToSave == null)
        applicationToSave = new Application();

    Mapper.Map(application, applicationToSave);  //May not be accurate, search for the  
                                          //method that writes into an existing object

    if (applicationToSave.ApplicationId == default(int))
    {
        ps.Application.InsertOnSubmit(applicationToSave);
    }                

    ps.Application.Context.SubmitChanges();
 } 

也就是说,您加载现有应用程序(或创建一个新应用程序),然后用自动映射器填充它。