2

新しいプロジェクトを開始し、ORM に Fluent nHibernate を使用して SharpArchitecture を使用することにしました。(nHibernate や SharpArchitecture を使用したことがないので、何か不足している場合は優しくしてください)

私がやろうとしていることは、これが正しい方法であるかどうか、またはnHibernateマップで可能であるかどうかはわかりません私の見解。軽量モデルの理由は、このビューのクライアント エンティティにある余分な情報を取り戻したくないからです。

したがって、クライアント エンティティに加えて、いくつかのフィールドのみを持つ ClientModel エンティティを作成し、nHibernate を使用して 2 つを一緒にマップすることを考えました。

私はいくつかのことを試みましたが、それらはすべて惨めに失敗しました。

私の質問 - これは nHibernate を使用する必要があるものですか、それとも automapper のようなものを使用する必要がありますか? nHibernate のマップという単語を、意味しないものを意味すると仮定して混乱させていますか?

ここで私を助けてくれるnHibernateの専門家を探しています。

また、小さなサンプルも大歓迎です。

ここにいくつかのコードがあります。

public class Client : EntityWithTypedId<Guid>
    {
        public virtual String Name { get; set; }
        public virtual String Slug { get; set; }
        public virtual IList<Address> Addresses { get; set; }
        public virtual String ClientSize { get; set; }
        public virtual String Industry { get; set; }
        public virtual String Founded { get; set; }
        public virtual String Type { get; set; }
        public virtual String Specialty { get; set; }
        public virtual Boolean ShowOnWebsite { get; set; }
        public virtual Image Logo { get; set; }
        public virtual Image LogoBlackAndWhite { get; set; }
        public virtual Image LogoHighResolution { get; set; }
        public virtual String FacebookUrl { get; set; }
        public virtual String TwitterUrl { get; set; }
        public virtual String LinkedInUrl { get; set; }
        public virtual IList<Project> Projects { get; set; }
        public virtual IList<Tag> Tags { get; set; }
        public override Guid Id { get; protected set; }
        public virtual DateTime CreatedDate { get; set; }
        public virtual String CreatedBy { get; set; }
        public virtual DateTime ModifiedDate { get; set; }
        public virtual String ModifiedBy { get; set; }
        public virtual DateTime? DeletedDate { get; set; }
        public virtual String DeletedBy { get; set; }
    }

public class ClientViewModel
    {
        public virtual String Name { get; set; }
        public virtual String Slug { get; set; }
    }


public class ClientTasks : IClientTasks
    {
        private readonly IRepositoryWithTypedId<Client, Guid> _clientRepository;
        private readonly IRepositoryWithTypedId<Image, Guid> _imageRepository;
        public ClientTasks(IRepositoryWithTypedId<Client, Guid> clientRepository, IRepositoryWithTypedId<Image, Guid> imageRepository)
        {
            _clientRepository = clientRepository;
            _imageRepository = imageRepository;
        }

        public List<Client> GetAll()
        {
            var allClients = _clientRepository.GetAll().ToList();
            return allClients;
        }
}
4

2 に答える 2

2

何をする必要があるかについて、大まかな考えをお持ちのようですね。クライアント側へのマッピングではなく、データベースへのデータの送信と取得には NHibernate を使用する必要があります。必要なデータのみをクライアントに送り返します。私は Automapper のファンであり、ユーザー インターフェイスを介して公開されたデータ オブジェクトとビューモデルの間のマッピングに使用しています。

これは非常に些細な例ですが、ビューにアカウント情報を表示する accountcontroller があるとします。次のようなものを使用して、データベースから情報を取得し、それをビューモデルにマップできます

public ActionResult Index(){
  var myAccount = _session.Get<Account>(1);
  var viewModel = _mapper.Map<Account,AccountViewModel>(myAccount);
  return View(viewModel);
}

automapper マッピング ファイルで、次のように設定します。

 Mapper.CreateMap<Account, AccountViewModel>()
     .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.FullName))
     .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FName));
于 2013-06-26T22:01:39.253 に答える