Tag: #automapper

使用AutoMapper,“相同类型的实体已经具有相同的主键值”错误

当我使用AutoMapper时,出现此错误: 附加“MyProject.DAL.User”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。 如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。 这可能是因为某些实体是新的并且尚未收到数据库生成的键值。 在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。 我想从数据库中检索User时将User映射到UserModel。 我在UI中更改UserModel属性,然后将其再次映射到User并更新它。 我的代码在这里: public UserModel GetUserByUserId(int id) { var user = db.Users.Where(p => p.UserId == id).FirstOrDefault(); var userModel = Mapper.Map(user); return userModel; } public void Update(UserModel userModel) { var user = Mapper.Map(userModel); db.Entry(user).State = EntityState.Modified; db.SaveChanges(); } 但如果我不使用自动映射器并编写类似下面的代码,它可以正常工作。 public void Update(UserModel userModel) { updatingUser.Email = userModel.Email; updatingUser.FirstName = userModel.FirstName; updatingUser.ModifiedDate […]

当对象属性和字典键名不同时,如何将对象/类属性映射到字典?

我正在调用Bloomberg Server API(用于股票市场数据)并将数据恢复到Dictionary其中字典的Key是Bloomberg一侧的Field Name ,该对象包含来自Bloomberg的数据值,可以是string , decimal , DateTime , boolean等。 获得Bloomberg数据后,我需要使用返回的值填充强类型实体/类。 根据我在对bloomberg的请求中发送的字段名称,返回的字典可以具有不同的键值。 我遇到的问题是, bloomberg字段名称和我的.net实体的属性名称不匹配 ,所以我不确定我是否可以使用AutoMapper或类似的库进行此映射。 我也尝试使用Tuple ,其中第一个元组项是bloomberg字段名,第二个元组项是我的实体的属性名,第三个元组项是从bloomberg返回的数据值。 这也没有成功(到目前为止),所以我想知道是否有一种简单的直接方式来维护这个bloombergfield EntityProperty映射并使用相应字段的Bloomberg数据值填充实体的值。 Generic(即使用C#Generics)解决方案会更好! 我已粘贴下面的示例控制台应用程序代码,因此您可以将其粘贴并试用。 2个字典,1个用于stockdata ,其他用于bonddata有假数据,但你明白了。 我还在下面添加了评论来重新迭代我想要完成的任务。 谢谢!! namespace MapBBFieldsToEntityProperties { using System; using System.Collections.Generic; class Program { public class StockDataResult { public string Name { get; set; } public decimal LastPrice { get; set; } public […]

AutoMapper – Condition和PreCondition之间有什么区别

假设使用AutoMapper进行映射,如下所示: mapItem.ForMember(to => to.SomeProperty, from => { from.Condition(x => ((FromType)x.SourceValue).OtherProperty == “something”); from.MapFrom(x => x.MyProperty); }); Precondition的替代条件有什么区别: from.PreCondition(x => ((FromType)x.SourceValue).OtherProperty == “something”); 这两种方法之间的实际区别是什么?

AutoMapper定义映射级别

public class Foo { public string Baz { get; set; } public List Bars { get; set; } } 当我映射上面的类时,有没有什么方法可以定义我想让automapper映射对象有多深? 我所追求的一些伪代码: var mapped = Mapper.Map(foo, opt => { levels: 0 }); // result = { Baz: “” } var mapped = Mapper.Map(foo, opt => { levels: 1 }); // result = { Baz: “”, Bars: […]

AutoMapper通用映射

我已经在StackOverflow上搜索并搜索了它,但我还没有找到任何帮助或建议。 我有一个像下面这样的类创建一个PagedList对象,并使用AutoMappper将类型从源映射到目标 public class PagedList { protected readonly List _items = new List(); public IEnumerable Items { get { return this._items; } } } 我想为这种类型创建一个Map,它应该将它转换为另一种类型,如下所示 public class PagedListViewModel { public IEnumerable Items { get; set; } } 我试过了 Mapper.CreateMap<PagedList, PagedListViewModel>(); 但编译器因TSrc和TDest而TDest 有什么建议吗?

铸造/制图代表

我有一个方法 public List GetUsers(Func expression) { var users = new List(); using(UserContext context = new UserContext()) { // obviously an error users = context.Users.ToList(); } return users; } 注意DTO.User(一个DTO)和Domain.User(一个来自EF的域实体)所以我使用AutoMapper来映射像这样的实体 public List GetUsers() { var users = new List(); using(UserContext context = new UserContext()) { Mapper.CreateMap(); users = Mapper.Map<List,List>(context.Users.ToList()); } return users; } 好吧,这看起来不错但是..我希望GetUser方法接受委托表达式作为参数。 我在ui中有一个显示用户列表的网格,它有很多过滤选项,所以我希望我的UI只调用1方法而不是每个filter创建方法。 // […]

使AutoMapper自动映射前缀属性

我希望AutoMapper自动映射这样的成员: class Model {public int ModelId {get; 组; }} class ModelDto {public int Id {get; 组; }} 在这里,我会做一个 CreateMap() .ForMember(x => x.Id, e => e.MapFrom(x => x.ModelId) 但是,我怎样才能使AutoMapper自动进行映射? 我的大部分课程都是这样的。 主键的格式为:ClassName +“Id”。 编辑: 我试过这个,但它不起作用: class Program { static void Main(string[] args) { Mapper.Initialize(exp => { exp.CreateMap(); exp.ForAllPropertyMaps(map => map.DestinationProperty.Name.Equals(“Id”), (map, expression) => expression.MapFrom(map.SourceType.Name + “Id”)); }); […]

AutoMapper是否也可用作重新形状映射工具

我知道AutoMapper只是映射两个对象之间的属性。 Automapper不是为了重塑数据,我认为这必须编程。 我有一个PeriodDTO.IEnumerable ,需要重新整形为PeriodListViewModel.List 。 每个CellViewModel包含一个List 这不是1比1的映射,我想也许这不应该被映射 – 因为它不可能 – public class PeriodRequest { public IEnumerable Periods { get; set; } public IEnumerable Weeks { get; set; } } public class PeriodListViewModel { public PeriodListViewModel(IEnumerable periods) { CellViewModels = new List(); var groupedPeriods = periods.GroupBy(p => p.LessonNumber).OrderBy(p => p.Key).ToList(); foreach (var groupedPeriod in groupedPeriods) { […]

使用AutoMapper将RowDataCollection映射到DTO

有没有办法使用AutoMapper将RowDataCollection映射到DTO ? 这是一个场景: DataRow to Object user.UserId = row[“UserId”]; user.UserName = row[“UserName”];

在N层应用程序中配置自动映射

我有一个N层应用程序,如下所示 MyApp.Model – 包含edmx和数据模型 MyApp.DataAccess – 使用EF的存储库 MyApp.Domain – 域/业务模型 MyApp.Services – 服务(类库) MyApp.Api – ASP.NET Web API 我使用Unity作为我的IoC容器,使用Automapper进行OO映射。 我的DataAccess图层引用了包含所有Data对象的Model层。 我不想在我的Api层中引用我的模型项目。 因此,从服务层返回DomainObjects(业务模型)并映射到API层中的DTO(DTO在API层中)。 我在API层中将domainModel配置为DTO映射,如下所示 public static class MapperConfig { public static void Configure() { Mapper.Initialize( config => { config.CreateMap(); config.CreateMap(); //can’t do this as I do not have reference for State which is in MyApp.Model //config.CreateMap(); […]