C# 使用automapper更新实体框架实体

C# 使用automapper更新实体框架实体,c#,entity-framework,entity-framework-4,automapper,C#,Entity Framework,Entity Framework 4,Automapper,我正在尝试使用实体框架,并让Automapper从我的合同中更新我的实体 我的代码如下所示: var temp = OrderContract; Order order = dataAccess.FindOne<Order>(x => x.OrderId == temp.OrderId) ?? new Order(); Mapper.Map(OrderContract, order); if (order.OrderId <= 0)

我正在尝试使用实体框架,并让Automapper从我的合同中更新我的实体

我的代码如下所示:

var temp = OrderContract;
Order order = dataAccess.FindOne<Order>(x => x.OrderId == temp.OrderId) 
              ?? new Order();

Mapper.Map(OrderContract, order);

if (order.OrderId <= 0)
   dataAccess.Add(order);
到处使用UseDestinationValue(此项不插入):

//+ Source
Mapper.CreateMap<SourceContract, Source>()
    .IgnoreAllNonExisting();

//+ SelectedRequirement
Mapper.CreateMap<SelectedRequirementContract, SelectedRequirement>()
    .ForMember(x => x.SelectedRequirementId, opt => opt.MapFrom(src => src.RequirementId))
    .IgnoreAllNonExisting();

//+ Comment Contract
Mapper.CreateMap<CommentContract, Comment>()
    .ForMember(x => x.CommentText, opt => opt.MapFrom(src => src.Comment))
    .IgnoreAllNonExisting();

//+ Order Automapper setup
Mapper.CreateMap<OrderContract, Order>()
    .ForMember(x => x.Source, opt => opt.MapFrom(src => src.Source))
    .ForMember(x => x.Comment, opt => opt.MapFrom(src => src.Comment))
    //Although a mapping was created for Comment entity,
    //we still need to map the CommentId of the Order entity otherwise it will remain null during an update.
    //Another way to handle this would be to Delete CommentId from the Order entity.
    //However, if anyone updates (Update from model) OrderDataModel.edmx that property would show up again thus causing
    //a null value to be inserted during an update.
    .ForMember(x => x.CommentId, opt => opt.MapFrom(src => src.Comment.CommentId))
    .ForMember(x => x.SelectedRequirements, opt => {opt.UseDestinationValue(); opt.MapFrom(src => src.Requirements);})
    .ForMember(x => x.OrderStateId, opt => opt.MapFrom(src => src.StateId))
    .ForMember(x => x.OrderStateId, opt => opt.MapFrom(src => src.StateId))
    .IgnoreAllNonExisting();
//+ Source
Mapper.CreateMap<SourceContract, Source>()
    .IgnoreAllNonExisting();

//+ SelectedRequirement
Mapper.CreateMap<SelectedRequirementContract, SelectedRequirement>()
    .ForMember(x => x.SelectedRequirementId, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.RequirementId); })
    .IgnoreAllNonExisting();

//+ Comment Contract
Mapper.CreateMap<CommentContract, Comment>()
    .ForMember(x => x.CommentText, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.Comment); })
    .IgnoreAllNonExisting();

//+ Order Automapper setup
Mapper.CreateMap<OrderContract, Order>()
    .ForMember(x => x.Source, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.Source); })
    .ForMember(x => x.Comment, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.Comment); })
    //Although a mapping was created for Comment entity,
    //we still need to map the CommentId of the Order entity otherwise it will remain null during an update.
    //Another way to handle this would be to Delete CommentId from the Order entity.
    //However, if anyone updates (Update from model) OrderDataModel.edmx that property would show up again thus causing
    //a null value to be inserted during an update.
    .ForMember(x => x.CommentId, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.Comment.CommentId); })
    .ForMember(x => x.SelectedRequirements, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.Requirements); })
    .ForMember(x => x.OrderStateId, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.StateId); })
    .ForMember(x => x.OrderStateId, opt => { opt.UseDestinationValue(); opt.MapFrom(src => src.StateId); })
    .IgnoreAllNonExisting();
/+源代码
Mapper.CreateMap()
.ignoreall不存在();
//+选择要求
Mapper.CreateMap()
.ForMember(x=>x.SelectedRequirementId,opt=>{opt.usedestationvalue();opt.MapFrom(src=>src.RequirementId);})
.ignoreall不存在();
//+评论合同
Mapper.CreateMap()
.ForMember(x=>x.CommentText,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.Comment);})
.ignoreall不存在();
//+订单自动映射设置
Mapper.CreateMap()
.ForMember(x=>x.Source,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.Source);})
.ForMember(x=>x.Comment,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.Comment);})
//虽然为注释实体创建了映射,
//我们仍然需要映射Order实体的CommentId,否则在更新期间它将保持为null。
//另一种处理方法是从订单实体中删除CommentId。
//但是,如果有人更新(从模型更新)OrderDataModel.edmx,则该属性将再次显示,从而导致
//更新期间要插入的空值。
.ForMember(x=>x.CommentId,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.Comment.CommentId);})
.ForMember(x=>x.SelectedRequirements,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.Requirements);})
.ForMember(x=>x.OrderStateId,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.StateId);})
.ForMember(x=>x.OrderStateId,opt=>{opt.UseDestinationValue();opt.MapFrom(src=>src.StateId);})
.ignoreall不存在();

我需要做什么才能插入和更新?

我认为您希望AutoMapper不要创建EF实体并获取您发送的实体。在AutoMapper的2.0版本中,有一个重载到映射方法,您可以在其中传递datacontext委托并让EF创建对象


请看这个

你能展示你的
订单
订单合同
类吗?@shuniar-我的合同可以在这里看到:。Order类是一个实体对象,非常大。除非有明确的理由,否则我不想让它看起来像样。你解决这个问题了吗?我也有同样的问题。AutoMapper不会合并,它会创建新的。如果要合并,则不要使用AutoMapper并编写自己的a->b映射方法。@O.O-AutoMapper可以同时执行这两种操作<代码>映射器.Map(sourceObject,destObject)