私はいろいろなことをいじって試してきましたが、どこかで間違っています。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");
}