1

私が現在取り組んでいるプロジェクトはEntityFrameworkを使用していますが、いくつかの問題が発生しているため、NHibernateを使用して調査しており、問題の大部分を解決できると考えています。

とにかく、私はシステムの単純な部分を複製してきましたが、非常に奇妙な結果をもたらすため、1対多の関係を持つ非常に単純な問題であると私が想定していることに遭遇しました。

これが私のエンティティです:

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のTas​​kPropertyも取得することです。これは、外部を介してタスクに関連する予想される4つのTaskPropertiesではありません。鍵。

これはEntityFrameworkで正常に機能し、これはどの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 に答える