使用Automapper仅映射某些属性

时间:2012-12-04 22:42:39

标签: c# entity-framework automapper

我正在尝试将模型映射到实体对象,但是当我映射从DB接收的实体对象时 - 我的更改不会保存在数据库中。

以下是一些代码:

映射配置:

Mapper.CreateMap<WalletUpdateModel, Wallet>()
    .ForMember(o => o.Name, m => m.MapFrom(d => d.Name))
    .ForMember(o => o.Currency, m => m.MapFrom(d => d.Currency));

实体对象:

public partial class Wallet
{
    public Wallet()
    {
        this.Transactions = new HashSet<Transaction>();
    }

    public int Id { get; set; }
    public int Owner { get; set; }
    public string Name { get; set; }
    public string Currency { get; set; }

    public virtual ICollection<Transaction> Transactions { get; set; }
}

模型声明:

public class WalletUpdateModel
{
    [Required]
    [Range(1, int.MaxValue)]
    public int Id { get; set; }

    [Required]
    [MaxLength(128)]
    public string Name { get; set; }

    [Required]
    [MaxLength(3)]
    [DataType(DataType.Currency)]
    public string Currency { get; set; }
}

来自立即窗口的一些调试信息:

w (before mapping)
{System.Data.Entity.DynamicProxies.Wallet_E3CA830BB5384920A3E07D4B44F15D2409093A34BFCED7CA33F9EC4102445554}
    [System.Data.Entity.DynamicProxies.Wallet_E3CA830BB5384920A3E07D4B44F15D2409093A34BFCED7CA33F9EC4102445554]: {System.Data.Entity.DynamicProxies.Wallet_E3CA830BB5384920A3E07D4B44F15D2409093A34BFCED7CA33F9EC4102445554}
    Currency: "PLN"
    Id: 2
    Name: "Cash"
    Owner: 1
    Transactions: Count = 0
w (after mapping)
{Financica.WebServices.Wallet}
    Currency: "PLN"
    Id: 2
    Name: "BZWBK"
    Owner: 0
    Transactions: Count = 0

请帮我解决这个问题,谢谢。

1 个答案:

答案 0 :(得分:0)

很抱歉,但您仍未说明哪个值映射不正确。

由于具有相同名称的属性会按惯例自动映射,因此您当前的映射可以更改为:

Mapper.CreateMap<WalletUpdateModel, Wallet>();

如果您希望避免更新目标属性,可以使用UseDestinationValue指令。如果要将条件应用于更新,可以使用Condition指令。如果您希望完全忽略该属性,可以使用Ignore指令。

最后,你测试了你的映射以确保你没有遗漏任何东西吗?例如,您的映射看起来可能与OwnerTransactions存在问题,因为它们未在WalletUpdateModel类中定义。您可以使用以下内容测试映射:

Mapper.AssertConfigurationIsValid();