Tag: #automapper

C#automapper嵌套集合

我有一个像这样的简单模型: public class Order{ public int Id { get; set; } … … public IList OrderLines { get; set; } } public class OrderLine{ public int Id { get; set; } public Order ParentOrder { get; set; } … … } 我用Automapper做的是这样的: Mapper.CreateMap(); Mapper.CreateMap(); Mapper.AssertConfigurationIsValid(); 它抛出一个exception,说:“OrderDto中的OrderLineDtos属性未映射,添加自定义映射…”当我们在Domain和DomainDto中使用自定义语法时,我如何指定OrderDto中的OrderLineDtos集合对应于OrderLines有序吗? 谢谢

如何为每个AppDomain配置一次AutoMapper

我目前的项目包括域模型,MVC Web应用程序和unit testing的程序集。 如何设置AutoMapper配置,以便所有程序集引用相同的配置? 我猜我可以在Global.asax中为web应用程序添加项目,但是如何在unit testing中使用它? 此外,如果配置在Global.asax中,域模型是否会选择地图? 非常感谢, KevDog。

为ASP .NET MVC创建unit testing的问题

我正在为我的ASP .NET MVC Controller类创建一些unit testing,我遇到了一些非常奇怪的错误: 我的控制器代码如下: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(JournalViewModel journal) { var selectedJournal = Mapper.Map(journal); var opStatus = _journalRepository.DeleteJournal(selectedJournal); if (!opStatus.Status) throw new System.Web.Http.HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); return RedirectToAction(“Index”); } 我的测试代码如下: [TestMethod] public void Delete_Journal() { // Arrange // Simulate PDF file HttpPostedFileBase mockFile = Mock.Create(); Mock.Arrange(() => mockFile.FileName).Returns(“Test.pdf”); Mock.Arrange(() => mockFile.ContentLength).Returns(255); // Create view […]

有条件地将一种源类型映射到两种目标类型

我有这样的源DTO public class Member { public string MemberId {get;set;} public string MemberType {get;set;} public string Name {get;set;} } 会员类型可以是“人”或“公司”。 还有两个这样的目的地类 public class PersonMember { public int PersonMemberId {get;set;} public string Name {get;set;} } public class CompanyMember { public int CompanyMemberId {get;set;} public string Name {get;set;} } 我想使用Automapper来检查MemberType在源类中的值,并根据该类型映射到两种目标类型之一。 我看到了有条件映射的例子,但它映射了它执行条件检查的字段。 我想检查条件并映射不同的字段。 var config = new MapperConfiguration(cfg => […]

使用AutoMapper从MVC中的ViewModel更新实体

我有一个Supplier.cs实体及其ViewModel SupplierVm.cs 。 我正在尝试更新现有供应商,但我收到黄色死亡屏幕(YSOD),并显示错误消息: 操作失败:无法更改关系,因为一个或多个外键属性不可为空。 当对关系进行更改时,相关的外键属性将设置为空值。 如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。 我想我知道它为什么会发生,但我不知道如何解决它 。 这是一个关于正在发生的事情的截屏video 。 我认为我收到错误的原因是因为当AutoMapper做它的事情时,这种关系就会丢失。 码 以下是我认为相关的实体 : public abstract class Business : IEntity { public int Id { get; set; } public string Name { get; set; } public string TaxNumber { get; set; } public string Description { get; set; } public string Phone { get; […]

如何从存储库中检索域对象

我对存储库域对象关系有一点了解。 以下是我对域名设计所了解的一些信息(它们可能也是错误的或不准确的)。 考虑到这些,我找不到从存储库中获取域对象的方法。 在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除。 没关系。 而且,从任何企业抽象数据访问也是一种很好的做法。 应用程序不需要知道我们存储数据的位置或存储数据的方式。 我们只要求存储库给我们一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储。 在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么。 因此,仅展示对象外部所需的内容是一种很好的做法。 因此,在我的脑海中,我无法找到实现我的存储库的方法。 我可以在我的代码中使用任何ORM或纯sql并检索数据。 但我无法从持久性对象创建域对象; 由于他们没有公共设置器,我无​​法创建和设置字段值。 声明包含所有字段的公共构造函数似乎不正确。 我可能有几个模型要填写,这意味着我必须定义几个具有不同参数集的构造函数。 任何帮助将不胜感激…

Automapper:ForMember中的复杂if else语句

假设Date是可以为空的DateTime: Mapper.CreateMap() .ForMember(dest => dest.Date, opt => opt.MapFrom(src => { DateTime? finalDate = null; if (src.HasDate == “N”) { // so it should be null } else { endResult = DateTime.Parse(src.Date.ToString()); } return finalDate; })); 我得到的错误是:“错误30带有语句主体的lambda表达式无法转换为表达式树。” 当然,我完全清楚我可以简化查询,例如: Mapper.CreateMap() .ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.HasDate == “N” ? null : DateTime.Parse(src.Date.ToString()))); 但是,如果我坚持保留第一个例子的结构,因为我有更复杂的if else语句,第二个例子无法满足或至少不具有可读性,该怎么办?

我应该在哪里放置automapper代码?

我在Asp.net mvc应用程序中使用Automapper。 我对automapper的用法有疑问 从很多示例代码中,我看到人们直接使用映射器Mapper.Map(source) ,我不确定这是不是很好,在我的观点中,我想将Mapper代码包装好代理对象而不是让它直接与controller public BankflowData CreateBankflowAdjustments(BankflowData addedBankFlow) { var bankflow = Mapper.Map(addedBankFlow); var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow); return Mapper.Map(newBankflow); } 在这个例子中,控制器对Class Bankflow ,它只知道dto BankflowData 。 我想知道这对于使用AutoMapper的应用程序是否是一个好习惯?

自动映射从XML创建对象

如果我有以下课程: class SPUser { public int ID { get; set; } public string Name { get; set; } public string LoginName { get; set; } public string Email { get; set; } public bool IsSiteAdmin { get; set; } public bool IsSiteAuditor { get; set; } public bool IsDomainGroup { get; set; } public List […]

AutoMapper:IDataReader和DTO对象之间的映射

我有一个DataReader,它包含存储过程的结果。 列的命名约定使用下划线表示空格。 我已经能够在IDataReader和IEnumerable之间成功映射,但前提是字段完全匹配。 我不希望存储过程中使用的命名约定规定我在对象中命名字段的方式。 在数据库方面也是如此。 我不认为我会成功地在DBA上执行Pascal Case。 我想避免使用我需要映射的ForMember()foreach字段。 这会破坏使用AutoMapper的目的。 我找到了一篇关于这个主题的post ,我在测试中用它作为参考。 我无法获得正确的配置/映射以使测试成功通过。 我希望有人可以提供帮助。 public class DataReaderTests { private DTOObject _result; private IDataReader _dataReader; protected override void Establish_context() { Mapper.Initialize(cfg => { cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention(); cfg.CreateMap<IDataReader, IEnumerable>(); }); _dataReader = new DataBuilder().BuildDataReader(); _result = Mapper.Map<IDataReader, IEnumerable>(_dataReader).FirstOrDefault(); } [Test] public void Then_a_column_containing_phone_number_should_be_read() […]