Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自由基继承问题_C#_Inheritance_Fluent Nhibernate - Fatal编程技术网

C# 自由基继承问题

C# 自由基继承问题,c#,inheritance,fluent-nhibernate,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个类,每个类代表各自的项,但是User和Email都继承

我有一个带有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个类,每个类代表各自的项,但是User和Email都继承自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映射具有对父级的引用,并且在UserMap中具有与电子邮件对应的多个

我无法让它保存电子邮件,因为它的DataItem ParentId已填写给用户。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

如果无法实现此级别的继承,请告诉我

如果是的话,你能为我提供适当的教程或帮助,纠正我的课堂地图吗

谢谢

找到了答案

我必须更改HasMany映射以包含数据项类型,以便它知道 从DataItem表而不是我的电子邮件表(该字段不存在)中提取字段parentId

HasMany<DataItem>(user => user.Emails).KeyColumn("parentid").Cascade.All();
很棒的工具。。非常强大

public virtual void AddEmail(Email email)
{
    email.Parent = this;  //forgot to set it's parent..
    Emails.Add(email);
}