public class CreateOrEditOwnerDetailInput : IInputDto
{
[Required]
public OwnerDetailEditDto OwnerDetail { get; set; }
}
[AutoMap(typeof(OwnerDetail))]
public class OwnerDetailEditDto
{
public const int MaxLength = 50;
public const int NotesMaxLength = 300;
public int? Id { get; set; }
[Required]
[MaxLength(MaxLength)]
public string LastName { get; set; }
[Required]
[MaxLength(MaxLength)]
public string CompanyName { get; set; }
[Required]
public OwnerContactDetailDto ContactDetail { get; set; }
[Required]
public AdditionalAddressDto AdditionalAddress { get; set; }
}
[Table("IpOwnerDetails")]
public class OwnerDetail : FullAuditedEntity
{
public const int MaxLength = 50;
public const int NotesMaxLength = 300;
[Required]
[MaxLength(MaxLength)]
public virtual string LastName { get; set; }
[Required]
[MaxLength(MaxLength)]
public virtual string CompanyName { get; set; }
[ForeignKey("AdditionalAddressId")]
public virtual AdditionalAddress AdditionalAddress { get; set; }
public virtual int AdditionalAddressId { get; set; }
[ForeignKey("ContactDetailId")]
public virtual ContactDetail ContactDetail { get; set; }
public virtual int ContactDetailId { get; set; }
}
public class OwnerContactDetailDto : FullAuditedEntityDto
{
public const int NumberMaxLength = 20;
[Required]
[MaxLength(NumberMaxLength)]
public string MainPhoneNumber { get; set; }
[MaxLength(NumberMaxLength)]
public string HomePhoneNumber { get; set; }
[Required]
public ContactDetailType Type { get; set; }
}
public class AdditionalAddressDto : FullAuditedEntityDto, IOutputDto
{
public const int MaxLength = 50;
[Required]
[MaxLength(MaxLength)]
public string StreetNumber { get; set; }
[Required]
public AddressType Type { get; set; }
[Required]
public int CityId { get; set; }
[Required]
public int StateId { get; set; }
}
Mapper.CreateMap<AdditionalAddress, AdditionalAddressDto>()
.ReverseMap()
.ForMember(additionalAddress => additionalAddress.Id, options => options.Ignore());
Mapper.CreateMap<ContactDetail, OwnerContactDetailDto>()
.ReverseMap()
.ForMember(contactDetail => contactDetail.Id, options => options.Ignore());
public async Task<int?> EditOwnerDetailAsync(CreateOrEditOwnerDetailInput input)
{
var ownerDetail = await _ownerDetailRepository.FirstOrDefaultAsync(p => p.Id == input.OwnerDetail.Id);
input.OwnerDetail.MapTo(ownerDetail);//after this it goes null
await _ownerDetailRepository.UpdateAsync(ownerDetail);
return input.OwnerDetail.Id;
}
图片网址:http: //imgur.com/a/GRdw6
Q:映射后里面的EditOwnerDetailAsync
方法都AdditionalAddress
和 ContactDetail
去哪里了null
。你能告诉我为什么吗?请查看图片了解更多信息。
例外 :
ERROR 2015-11-20 17:56:18,666 [26 ] lers.Filters.AbpExceptionFilterAttribute - System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while
updating the entries. See the inner exception for details. --->
System.Data.Entity.Core.UpdateException: An error occurred while updating the
entries. See the inner exception for details. --->
System.Data.SqlClient.SqlException: The UPDATE statement conflicted with the
FOREIGN KEY constraint
"FK_dbo.IpOwnerDetails_dbo.IpAdditionalAddresses_AdditionalAddressId". The
conflict occurred in database "IP", table "dbo.IpAdditionalAddresses", column 'Id'.
The statement has been terminated.
注意:这里奇怪的是,当我将调试指针带回input.OwnerDetail.MapTo(ownerDetail);
行(第二次)时,它会填充AdditionalAddress
和对象的数据ContactDetail
。它怎么会发生?