1

私はいろいろなことをいじって試してきましたが、どこかで間違っています。AutoMapperを使用して最初の試みをできるだけ簡単にしようとしました。CreateBrandViewModelを使用して、新しいブランドを作成し、データベースに保存しようとしています。これのいくつかは少しフルーティーに見えるかもしれませんが、私はそれを可能な限り簡単な方法で機能させることを試みました。

ドメイン:

public class Brand : EntityBase
{
    public virtual string Name { get; set; } //Not Nullable
    public virtual bool IsActive { get; set; } // Not Nullable
    public virtual Product DefaultProduct { get; set; } // Nullable
    public virtual IList<Product> Products { get; set; } // Nullable
}

ViewModel:

public class CreateBrandViewModel
{
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

コントローラ

これは私がしばらく遊んでいた場所なので、今は少し奇妙に見えます。コメントアウトされたコードは私の問題を解決していません。

    [HttpPost]
    public ActionResult Create(CreateBrandViewModel createBrandViewModel)
    {
        if(ModelState.IsValid)
        {

            Mapper.CreateMap<Brand, CreateBrandViewModel>();
                //.ForMember(
                //    dest => dest.Name,
                //    opt => opt.MapFrom(src => src.Name)
                //)
                //.ForMember(
                //    dest => dest.IsActive,
                //    opt => opt.MapFrom(src => src.IsActive)
                //);

            Mapper.Map<Brand, CreateBrandViewModel>(createBrandViewModel)
            Session.SaveOrUpdate(createBrandViewModel);
            return RedirectToAction("Index");
        }

        else
        {
            return View(createBrandViewModel);
        }
    }

念のため、BrandControllerはSessionController(Ayendesの方法)を継承し、トランザクションはActionFilterを介して管理されます。それは少し無関係だと思いますが。私はさまざまな方法を試したので、さまざまなエラーメッセージが表示されます。何が起こっているのかを見て、それをどのように使用するのかを教えていただければ、すばらしいと思います。

参考までに、ブランドの流暢なnhibernateマッピング:

public class BrandMap : ClassMap<Brand>
{
    public BrandMap()
    {
        Id(x => x.Id);

        Map(x => x.Name)
            .Not.Nullable()
            .Length(50);

        Map(x => x.IsActive)
            .Not.Nullable();

        References(x => x.DefaultProduct);

        HasMany(x => x.Products);

    }
}

編集1

次のコードを試しましたが、Session.SaveOrUpdate(updatedModel)にブレークポイントを設定すると、フィールドはnullおよびfalseになりますが、そうではないはずです。

            var brand = new Brand();
            var updatedBrand = Mapper.Map<Brand, CreateBrandViewModel>(brand, createBrandViewModel);
            Session.SaveOrUpdate(updatedBrand);
            return RedirectToAction("Index");
        }
4

1 に答える 1

2

ポストからの帰りの旅行で、間違った方法でマッピングを行っているようです。別の構文がここで役立つ場合があります。試してみてください。

// setup the viewmodel -> domain model map 
// (this should ideally be done at initialisation time, rather than per request)
Mapper.CreateMap<CreateBrandViewModel, Brand>();
// create our new domain object
var domainModel = new Brand();
// map the domain type to the viewmodel
Mapper.Map(createBrandViewModel, domainModel);
// now saving the correct type to the db
Session.SaveOrUpdate(domainModel);

それが卵を割るかどうか私に知らせてください...またはちょうどあなたの顔に卵をもう一度:-)

于 2012-08-10T11:20:07.477 に答える