我开始了一个新项目,并决定为我的ORM使用Fluent nHibernate的SharpArchitecture。(我以前从未使用过nHibernate或SharpArchitecture,所以如果我错过了什么,请温柔一点)
我正在尝试做的是,我不确定这是否是正确的方式,也不确定nHibernate映射是否可能,即获取一个域实体(比如客户端),并将其映射到一个更轻的ClientModel,该模型将在我的视图中使用。之所以使用较轻的模型,是因为我不想为该视图带回客户端实体中的额外信息。
因此,我的想法是在我的客户端实体之外创建一个只有几个字段的ClientModel实体,并使用nHibernate将两者映射在一起。
我试过一些东西,但都失败得很惨。
我的问题-这是我应该使用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;
}
}
听起来你对需要做的事情有一个很好的高层想法。您应该使用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));
因此,我决定将任务层(只返回完整对象的存储库)中的代码放入每个视图的查询类中(只选择我想要的属性并将它们映射到我的ViewModel)。
此外,我决定通过nhibernate使用映射,因为选择特定的列迫使我无论如何都要将字段从对象数组映射回我的域,所以我想既然我已经需要这样做了,我也可以使用TransformUsing方法。
ClientListQuery.cs
public IList<ClientListViewModel> GetClientListQuery()
{
ClientListViewModel clientListViewModel = null;
return Session.QueryOver<Client>()
.OrderBy(o => o.Name).Asc
.SelectList(list => list
.Select(c => c.Id).WithAlias(() => clientListViewModel.Id)
.Select(c => c.Name).WithAlias(() => clientListViewModel.Name)
...
.Select(c => c.Logo.Id).WithAlias(() => clientListViewModel.LogoId)
.Select(c => c.LogoBlackAndWhite.Id).WithAlias(() => clientListViewModel.LogoBlackAndWhiteId))
.TransformUsing(Transformers.AliasToBean<ClientListViewModel>())
.List<ClientListViewModel>();
}
客户端控制器
[Transaction]
public ActionResult Read([DataSourceRequest] DataSourceRequest request)
{
return Json(_clientListQuery.GetClientListQuery().ToDataSourceResult(request));
}