2

初心者アラート データベースにエンティティが存在するかどうかを確認しようとしています。存在する場合は更新し、そうでない場合は新しいエンティティを作成します。しかし、CreateCriteria の使用は常に ID のないエンティティを返しますか? 理由はありますか?手動マッピング、つまりClassMapの使用に流暢なnhibernateを使用しています。

基本クラス - Id パブリック プロパティのみを保持

public 抽象クラス EntityBase : IEquatable { public virtual int Id { get; 設定; }

    public virtual bool Equals(EntityBase obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (GetType() != obj.GetType()) return false;
        return obj.Id == Id;
    }
}

マッピング;

public class ProjectNameMap: ClassMap<ProjectName>
{
    public ProjectNameMap()
    {
        Table("dbo.TABLENAME");
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.PROJECT_NAME).Not.Nullable();
        Map(x => x.PROJECT_DESCRIPTION);
    }
}

エンティティを取り戻す;

    public static T GetEntityByRestrictions<T>(String propertyName, String propertyValue)
                where T:EntityBase
    {
        using (var session = SessionManager.CreateSessionFactory().OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var entity=  session.CreateCriteria<T>(propertyValue)
                                    .Add(Restrictions.Eq(propertyName, propertyValue))
                                    .UniqueResult<T>();
                return entity;
            }
        }
    }
}

私が試した 2 つのばかげたステップ (笑ってはいけない) 1. 私が試したばかげたステップは、既存のデータベース エントリに一致する Id =52 を手動で設定することでした。

  1. さらにばかげた手順 (笑い声が聞こえます) は、Map(x=>x.Id).Update().Insert() を含むようにマッピング ファイルを変更し、これにより INSERT_IDENTITY が OFF (または何か) に設定されます。

Id を持つエンティティを取得し、後で更新する最良の方法は何ですか?私の CreateCriteria に何か問題がありますか?

4

1 に答える 1

0

セッションでMergeメソッドを呼び出すと、まさにあなたが望むことができると思います。

更新/挿入するエンティティを引数として入れるだけで、エンティティが既に存在する場合はプロパティが更新され、存在しない場合は新しいインスタンスが保持されます。この方法では、 CreateCriteriaは必要なく、ソリューションははるかに簡単になります。

于 2011-07-29T16:14:48.567 に答える