基本流利的NHibernate关系问题

时间:2013-02-08 20:13:24

标签: nhibernate fluent-nhibernate

我目前正在开发的项目是使用实体框架,但是我们遇到了一些问题,因此我正在研究使用NHibernate,我们相信这将解决我们所遇到的大多数问题。

无论如何,我一直在复制系统的一个简单部分,但我遇到了一个我认为是一个非常简单的问题与一对多的关系,因为它给出了非常奇怪的结果。

以下是我的实体:

public class Task : Base.Domain
{
    private IList<TaskProperty> _taskProperties = new BindingList<taskProperty>();
    private string _name = String.Empty;
    private string _description = String.Empty;

    public virtual IList<TaskProperty> TaskProperties
    {
        get
        {
            return _taskProperties;
        }
        set
        {
            if (_taskProperties == value) return;
            _taskProperties = value;
            OnNotifiyPropertyChanged("TaskProperties");
        }
    }

    public virtual string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (_name == value) return;
            _name = value;
            base.OnNotifiyPropertyChanged("Name");
        }
    }

    public virtual string Description
    {
        get
        {
            return _description;
        }
        set
        {
            if (_description == value) return;
            _description = value;
            base.OnNotifiyPropertyChanged("Description");
        }
    }

    public Task() 
        : base()
    { }      
}

public class TaskProperty : Base.Domain
{
    private Task _task = null;
    private string _name = string.Empty;
    private string _description = string.Empty;
    private int _propertyType = 0;            

    //public virtual int TaskID { get; set; }
    public virtual Task Task
    {
        get
        {
            return _task;
        }
        set
        {
            if (_task == value) return;
            _task = value;
            OnNotifiyPropertyChanged("Task");
        }
    }

    public virtual string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (_name == value) return;
            _name = value;
            OnNotifiyPropertyChanged("Name");
        }
    }

    public virtual string Description
    {
        get
        {
            return _description;
        }
        set
        {
            if (_description == value) return;
            _description = value;
            OnNotifiyPropertyChanged("Description");
        }
    }

    public virtual int PropertyType
    {
        get
        {
            return _propertyType;
        }
        set
        {
            if (_propertyType == value) return;
            _propertyType = value;
            OnNotifiyPropertyChanged("PropertyType");
        }
    }

    public TaskProperty()
        : base()
    { }     
}

以下是我的NHibernate映射:

public class TaskMapping : ClassMap<Task>
{
    public TaskMapping()
    {
        Id(x => x.Id).Column("RETTaskID");
        Map(x => x.Name);
        Map(x => x.Description);
        Map(x => x.Version);
        HasMany(x => x.TaskProperties).KeyColumn("RETTaskPropertyID");
        Table("RETTask");
    }
}

public class TaskPropertyMapping : ClassMap<TaskProperty>
{
    public TaskPropertyMapping()
    {
        Id(x => x.Id).Column("RETTaskPropertyID");
        Map(x => x.Name);
        Map(x => x.Description);
        Map(x => x.PropertyType);
        References(x => x.Task).Column("RETTaskID");
        Table("RETTaskProperty");
    }
}

注意:这些实体继承的Domain类包含ID(int Id)。

我面临的问题是,当我从ID为27的数据库中获取I Task时,我得到ID为27的TaskProperty,而不是与任务相关的预期的4个TaskProperties通过外键。

这在Entity Framework中运行良好,我知道这对于任何ORM都是一个简单的情况,所以我假设我已经错误地设置了映射,但是从我发现的所有示例中,我似乎没有做任何事情错了!

欢迎任何答案/建议。感谢。

1 个答案:

答案 0 :(得分:1)

你快到了。 HasMany和References的Column映射必须相同:

public TaskMapping()
{
  ...
  HasMany(x => x.TaskProperties).KeyColumn("RETTaskID"); // use this
  // HasMany(x => x.TaskProperties).KeyColumn("RETTaskPropertyID"); // instead of this
}
public TaskPropertyMapping()
{
  ...
  References(x => x.Task).Column("RETTaskID");
}

集合项必须具有对所有者的引用列。此列用于两个方向,因为这是DB管理中的引用...