C# 自动映射器映射覆盖嵌套子实体属性

C# 自动映射器映射覆盖嵌套子实体属性,c#,.net,object,nested,automapper,C#,.net,Object,Nested,Automapper,我刚开始使用Automapper,并用嵌套子实体的一个特定行为阻止了它 在更新父对象的子对象时,Automapper将目标对象中的子对象替换为使用目标数据中的数据创建的新实例,而不是按属性复制属性。为了更好地解释这个问题,我复制了下面的测试代码: class Program { static void Main(string[] args) { Mapper.CreateMap<PersonDTO, Person>(); Mapper

我刚开始使用Automapper,并用嵌套子实体的一个特定行为阻止了它

在更新父对象的子对象时,Automapper将目标对象中的子对象替换为使用目标数据中的数据创建的新实例,而不是按属性复制属性。为了更好地解释这个问题,我复制了下面的测试代码:

class Program
{
    static void Main(string[] args)
    {

        Mapper.CreateMap<PersonDTO, Person>();
        Mapper.CreateMap<UserLoginDTO, UserLogin>();

        Person pmodel = new Person()
        {
            Id = 10,
            FullName = "XYZ",
            LoginInfo = new UserLogin() { Id = 10, UserName = "xyz" }
        };

        PersonDTO pdto = new PersonDTO()
        {
            Id = 10,
            FullName = "XYZ",
            LoginInfo = new UserLoginDTO() { Id = 10, UserName = "abc" }
        };

        pmodel.Initiated();
        pmodel.LoginInfo.Initiated();
        Console.WriteLine("model => LoginInfo => IsInitiated : {0}", pmodel.LoginInfo.IsInitiated);
        Mapper.Map<PersonDTO, Person>(pdto, pmodel);
        Console.WriteLine("model => LoginInfo => IsInitiated : {0}", pmodel.LoginInfo.IsInitiated);

    }
}

public class PersonDTO
{
    public int Id
    {
        get;
        set;
    }

    public String FullName
    {
        get;
        set;
    }


    public UserLoginDTO LoginInfo { get; set; }
}

public class UserLoginDTO
{

    public int Id
    {
        get;
        set;
    }

    public String UserName
    {
        get;
        set;
    }
}

public class Person : BaseEntity
{
    private int _id;
    private string _name;
    private UserLogin _loginInfo;

    public int Id { 
        get { return _id;  }
        set { _id= value; }
    }

    public String FullName
    {
        get { return _name; }
        set { _name = value; }
    }

    public UserLogin LoginInfo { get { return _loginInfo; } set { _loginInfo = value; } }

}

public class UserLogin : BaseEntity
{
    private int _id;
    private string _userName;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public String UserName
    {
        get { return _userName; }
        set { _userName= value; }
    }
}


public abstract class BaseEntity
{
    private bool _isInitiated = false;

    public bool IsInitiated { get { return _isInitiated; } }

    public void Initiated()
    {
        this._isInitiated = true;

    }
}
类程序
{
静态void Main(字符串[]参数)
{
CreateMap();
CreateMap();
Person pmodel=新的Person()
{
Id=10,
FullName=“XYZ”,
LoginInfo=newuserlogin(){Id=10,UserName=“xyz”}
};
PersonDTO pdto=新的PersonDTO()
{
Id=10,
FullName=“XYZ”,
LoginInfo=new UserLoginDTO(){Id=10,UserName=“abc”}
};
pmodel.Initiated();
pmodel.LoginInfo.initialized();
WriteLine(“model=>LoginInfo=>IsInitiated:{0}”,pmodel.LoginInfo.IsInitiated);
Mapper.Map(pdto、pmodel);
WriteLine(“model=>LoginInfo=>IsInitiated:{0}”,pmodel.LoginInfo.IsInitiated);
}
}
公共类个人
{
公共整数Id
{
得到;
设置
}
公共字符串全名
{
得到;
设置
}
公共用户登录到登录信息{get;set;}
}
公共类UserLoginDTO
{
公共整数Id
{
得到;
设置
}
公共字符串用户名
{
得到;
设置
}
}
公共类人物:BaseEntity
{
私人内部id;
私有字符串\u名称;
私有用户登录_loginInfo;
公共整数Id{
获取{return\u id;}
设置{u id=value;}
}
公共字符串全名
{
获取{return\u name;}
设置{u name=value;}
}
public UserLogin LoginInfo{get{return{u LoginInfo;}set{{u LoginInfo=value;}}
}
公共类UserLogin:BaseEntity
{
私人内部id;
私有字符串\u用户名;
公共整数Id
{
获取{return\u id;}
设置{u id=value;}
}
公共字符串用户名
{
获取{return\u userName;}
设置{u userName=value;}
}
}
公共抽象类BaseEntity
{
private bool _isInitiated=假;
公共bool已初始化{get{return}
公众假期
{
这是正确的;
}
}
上述代码的输出为:

映射前:model=>LoginInfo=>IsInitiated:True 映射后:model=>LoginInfo=>IsInitiated:False


我的要求是在映射后保留IsInitiated属性。我在这里遗漏了什么。

我也有同样的问题。我最终使用了该映射方法的返回值


var result=Mapper.Map(pdto,pmodel)查看任何相关问题以找到解决方法。我查看了相关帖子,没有一篇与我的问题接近。我的朋友提出了一个忽略嵌套对象的解决方案,并在AfterMap事件中处理嵌套对象。我发布这个问题是为了从专家那里找到更好的解决方案。啊,我误解了一些相关的问题。查看Automapper的wiki,似乎Ignore()方法可以完成您所寻找的内容。类似于Mapper.CreateMap().FormMember(“IsInitiated”,src=>src.Ignore());非常感谢。不幸的是,这不起作用。从行为上,我理解的是,在亲自更新LoginInfo属性时,AutoMapper会将其替换为UserLogin对象的新实例。当我复制并运行您的确切代码时,我得到model=>LoginInfo=>IsInitiated:True model=>LoginInfo=>IsInitiated:True此方法非常有用,当源和目标对象具有相同的属性,但我们希望Automapper不要将特定属性从源复制到目标时。在我的例子中,目标中嵌套的子对象被源中的对象替换,而不是使用定义映射该子对象。然而,这种行为在旧版本中似乎是缺陷,但在最新版本中已修复。