NHibernate:将多个列映射到单个集合中
假设我有一张桌子:NHibernate:将多个列映射到单个集合中,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,假设我有一张桌子: ID(pk) | HOME_EMAIL | WORK_EMAIL | OTHER_EMAIL ------------------------------------------------- 还有.NET类 class A { int id; List<MyEmail> emails; } class MyEmail { string email; } A类{ int-id; 列出电子邮件; } 类邮件{ 字符串电子邮件; }
ID(pk) | HOME_EMAIL | WORK_EMAIL | OTHER_EMAIL
-------------------------------------------------
还有.NET类
class A {
int id;
List<MyEmail> emails;
}
class MyEmail {
string email;
}
A类{
int-id;
列出电子邮件;
}
类邮件{
字符串电子邮件;
}
我想在NHibernate中没有办法将这些(多个)列映射到单个集合,或者有吗?:)
到了一定程度,我们不想再修补数据库模式,这样我们就不能对数据库做太多事情了,如果这有帮助的话。我建议使用接口,这样您就可以做类似的事情了
interface IUser
{
int Id {get; set;}
IEnumerable<string> Emails {get;}
}
class MyUser : IUser
{
public int Id {get; set;}
public IEnumerable<string> Emails
{
get
{
return new [] { SomeEmail, SomeOtherEmail };
}
}
public string SomeEmail { get; set; }
public string SomeOtherEmail { get; set; }
}
接口IUser
{
int Id{get;set;}
IEnumerable电子邮件{get;}
}
类MyUser:IUser
{
公共int Id{get;set;}
公开电子邮件
{
得到
{
返回新[]{SomeEmail,SomeOtherEmail};
}
}
公共字符串SomeEmail{get;set;}
公共字符串SomeOtherEmail{get;set;}
}
您的应用程序可能需要一个IUser,而不关心我们从何处获得电子邮件列表。您可以在NH中映射MyUser,而应用程序不(也不应该)关心实际的实现。如果它不必是集合,但可以是自定义类型,则可以说是包含三个属性的
EmailAddresses
:
public class EmailAddresses
{
public virtual string Home { get; set; }
public virtual string Work { get; set; }
public virtual string Other { get; set; }
}
可以使用组件将三列映射到此对象的三个属性,作为父对象上的单个属性:
public class MyUser
{
...
public virtual EmailAddresses { get; set; }
}
您可以使用NHibernate映射这些组件,或者如果您正在使用
ComponentMap
classmap(automapper不能做组件)。有一个功能非常接近您想要的,
上的文档应该可以让您开始使用。是的,字典可以为数据库模式提供更具逻辑性的映射(至少在一个框架列表上),因为它们是键式的。我也会研究一下,谢谢!是的,这实际上是第一个实现,就在一些调整之前,这给我们留下了上面的例子。:)我有点偏爱这种结构,但如果有一种方法可以做到这一点,而不必进行另一次架构更改,我认为我们的开发人员将朝着这一方向迈进。:)+1对于封装,请抬起头。这一个看起来更像我们以前的实现,加上这个新实现。我会看看我能用它做些什么。