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;
}
Image url : https://i.stack.imgur.com/6DMsK.jpg
Q : After the mapping inside the EditOwnerDetailAsync
method where both AdditionalAddress
and ContactDetail
goes to null
.Could you tell me why ? Please see the image for more info.
Exception :
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.
NOTE : The strange thing here is when I bring the debug pointer back to the input.OwnerDetail.MapTo(ownerDetail);
line (2nd time) then it fills data for the AdditionalAddress
and ContactDetail
objects.How can It be happened ?