【问题标题】:Why is automapper making Entity Framework insert instead of update?为什么自动映射器使实体框架插入而不是更新?
【发布时间】:2012-02-03 21:21:17
【问题描述】:

我有一个客户表,其中包含对地址表的外部引用。看来 AutoMapper 正在做某事让 EF 认为我的地址引用是一条新记录,而不是更新现有记录。

此代码正确更新地址记录。它不会添加一个新的:

using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
{
    CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);

    DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);

    updateCustomer.ResellerID = customer.ResellerID;
    updateCustomer.CustomerType = customer.CustomerType;
    updateCustomer.Password = customer.Password;
    updateCustomer.Comments = customer.Comments;

    updateCustomer.Address.ResellerID = customer.Address.ResellerID;
    updateCustomer.Address.AddressCode = customer.Address.AddressCode;
    updateCustomer.Address.AddressType = customer.Address.AddressType;
    updateCustomer.Address.CompanyName = customer.Address.CompanyName;
    updateCustomer.Address.LastName = customer.Address.LastName;
    updateCustomer.Address.FirstName = customer.Address.FirstName;

    uow.SaveChanges();
}

此代码将始终添加新的地址记录:

using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
{
    CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);

    DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);

    Mapper.CreateMap<Customer, Customer>()
        .ForMember(dest => dest.CustomerID, opt => opt.Ignore());
    Mapper.Map(customer, updateCustomer);

    Mapper.CreateMap<Address, Address>()
        .ForMember(dest => dest.ID, opt => opt.Ignore());
    Mapper.Map(customer.Address, updateCustomer.Address);

    uow.SaveChanges();
}

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: entity-framework automapper poco


    【解决方案1】:

    我刚刚想通了。

    AutoMapper 正在映射客户中的所有字段,包括地址字段。以下代码效果很好:

    using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
    {
        CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);
    
        DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);
    
        Mapper.CreateMap<Customer, Customer>()
            .ForMember(dest => dest.CustomerID, opt => opt.Ignore())
            .ForMember(dest => dest.Address, opt => opt.Ignore());  // <-- This was the problem!
        Mapper.Map(customer, updateCustomer);
    
        Mapper.CreateMap<Address, Address>()
            .ForMember(dest => dest.ID, opt => opt.Ignore());
        Mapper.Map(customer.Address, updateCustomer.Address);
    
        uow.SaveChanges();
    }
    

    【讨论】:

    • AutoMapper 映射嵌套属性。意味着您不需要单独映射地址。只需在映射“客户”之前为其创建一个映射,它将自动映射。
    • 如何创建嵌套地图?
    • AutoMapper 开箱即用地支持它,在映射之前为所有嵌套类型“CreateMap”。
    • 正如马克西姆指出的那样。您应该将您的 Mapper.CreateMap 语句移到对 Customer 的 Mapper.Map() 调用上方。
    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多