1

我目前正在从事的项目是使用实体框架,但是我们遇到了一些问题,因此我正在研究使用 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 来说都是一个简单的情况,所以我假设我的映射设置不正确,但是从我找到的所有示例来看,我似乎没有做错任何事情!

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

4

1 回答 1

1

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

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

于 2013-02-09T04:19:44.273 回答