流畅的NHibernate继承问题

时间:2009-10-27 00:04:24

标签: c# inheritance fluent-nhibernate

我有一个包含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 ..

如果无法达到此级别的继承,请告知我们。

如果是的话,您可以通过更正我的课程地图向我提供正确的教程或帮助吗?

谢谢!

1 个答案:

答案 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);
}

非常棒的工具..非常强大!