我有一个包含3个表的数据库设置
t_DataItem
pk id int auto
isActive bit 0
dateCreated datetime getdate()
parentId int null
t_User
pk id int
firstName varchar(50)
lastName varchar(50)
t_Email
pk id int
address varchar(50)
所以现在我有3个类,每个类代表相应的项目,但用户和电子邮件都继承自DataItem。
public class DataItem
{
public virtual int Id { get; private set; }
public virtual DateTime DateCreated { get ; set; }
public virtual bool IsActive { get; set; }
public virtual DataItem Parent { get; set; }
public DataItem()
{
DateCreated = DateTime.Now;
}
}
public class Email : DataItem
{
public virtual string Address { get; set; }
}
public class User : DataItem
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual IList<Email> Emails { get; private set; }
public User()
{
Emails = new List<Email>();
}
public virtual void AddEmail(Email email)
{
Emails.Add(email);
}
}
因此,当我保存用户或电子邮件时,它应首先保存dataitem记录,将其id传递给用户或电子邮件的id(真正的任何子类)。
我有那部分工作..我的问题在于设置
的映射DataItem Mapping用于引用父对象,以及UserMap中与电子邮件对应的HasMany。
我无法保存电子邮件,并将其DataItem ParentId填写到User.Id
因此,如果我有一个用户记录,我应该有一个相应的dataitem记录
如果我有电子邮件记录,我应该有一个相应的dataItem记录,其parentId设置为用户记录ID的id。
希望我已经解释过了......
有人可以告诉我一个如何使用Fluent NHibernate将其映射出来的例子吗?
我的映射如下
public class DataItemMap : ClassMap<DataItem>
{
public DataItemMap()
{
Table("t_DataItem");
Id(map => map.Id);
Map(map => map.DateCreated).Nullable();
Map(map => map.IsActive);
References(map => map.Parent).Column("parentid");
}
}
public class EmailMapping : SubclassMap<Email>
{
public EmailMapping()
{
Table("t_emails");
KeyColumn("id");
Map(email => email.Address);
}
}
public class UserMapping : SubclassMap<User>
{
public UserMapping()
{
Table("t_Users");
KeyColumn("id");
Map(user => user.FirstName);
Map(user => user.LastName);
HasMany(user => user.Emails).KeyColumn("id").Cascade.All();
}
}
我喜欢它如何自动创建dataitem记录并抓住它的id并将其存储到我的用户或电子邮件表中..现在,如果我可以得到最后一块拼图找出我保存电子邮件的地方,不仅如此它保存了dataitem记录,但填写了parentid,然后当我为用户提取电子邮件时,它会根据连接上的父ID检查用户ID ..
如果无法达到此级别的继承,请告知我们。
如果是的话,您可以通过更正我的课程地图向我提供正确的教程或帮助吗?
谢谢!
答案 0 :(得分:0)
想通了
我不得不改变我的HasMany映射以包含DataItem类型以便它知道 从DataItem表而不是我的电子邮件表(字段不存在)中提取字段parentId
HasMany<DataItem>(user => user.Emails).KeyColumn("parentid").Cascade.All();
然后在我的User类中将AddEmail方法更改为
public virtual void AddEmail(Email email)
{
email.Parent = this; //forgot to set it's parent..
Emails.Add(email);
}
非常棒的工具..非常强大!