【问题标题】:Basic Fluent NHibernate relationship issue基本的 Fluent NHibernate 关系问题
【发布时间】:2013-02-09 17:17:17
【问题描述】:

我目前正在进行的项目是使用实体框架,但是我们遇到了一些问题,因此我正在研究使用 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,而不是预期的与 Task 相关的 4 个 TaskProperty通过外键。

这在实体框架中运行良好,我知道这对于任何 ORM 来说都是一个简单的情况,所以我假设我的映射设置不正确,但是从我找到的所有示例中,我似乎没有做任何事情错了!

任何答案/建议都将受到欢迎。谢谢。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案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 中的引用管理方式...

    【讨论】:

    • 谢谢,我尝试了你的建议,但我仍然遇到同样的问题。但是,我在两个映射类中都尝试了 .KeyColumn("RETTaskID") 并且有效。似乎有道理,尽管我一开始没有明白!再次感谢。
    • 哦,是的 ;) 你是对的,我用固定名称编辑了答案。本质在于为两个映射重用一列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多