2

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;
                }
            }
        }
4

0 に答える 0