automapper bind によって取得されたモデルを更新しようとしています。
私の更新機能が実行されるとき
Context.Entry(obj).State = EntityState.Modified;
エンティティ フレームワークがこの例外をスローする
多重度の制約に違反しています。関係「Creci.Infra.Data.Context.LegislationCategory_Legislations」のロール「LegislationCategory_Legislations_Source」の多重度は 1 または 0..1 です。
オートマッパーを使用せずにモデルを更新しようとすると、正常に動作します。
関係は
public class LegislationCategoryMap : EntityTypeConfiguration<LegislationCategory>
{
public LegislationCategoryMap()
{
...
HasMany(x => x.Legislations)
.WithRequired(x => x.Category)
.WillCascadeOnDelete(true);
}
}
public class LegislationMap : EntityTypeConfiguration<Legislation>
{
public LegislationMap()
{
...
HasRequired(x => x.Category);
}
}
そして、私のマッパープロファイル構成は
CreateMap<EditLegislationViewModel, Legislation>()
.EqualityComparision((vm, m) => vm.Id == m.Id)
.AfterMap((vm, m) =>
{
...
if (vm.Category == null && vm.CategoryId != 0)
{
m.Category = new LegislationCategoryRepository().GetById(vm.CategoryId);
}
});
ビューモデルがリクエストからバインドされている場合、aftermap を使用してカテゴリを Legislation オブジェクトにマップしました。
私のコントローラーコードは
var model = Mapper.Map(viewModel, repository.GetById(id));
repository.Update(model);
そして更新機能
public void Update(TEntity obj)
{
Validate(obj);
using (var transaction = Context.Database.BeginTransaction())
{
try
{
Context.Entry(obj).State = EntityState.Modified;
Context.SaveChanges();
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
}
}