これは、Comment.BlogArticleID に null を挿入しようとしています。
次の GenericADOException が表示されました。
次の内部例外が発生しました:「値 NULL を列 'BlogArticleID'、テーブル 'Relationships_Test_OneToMany.dbo.Comment' に挿入できません。列は NULL を許可しません。INSERT は失敗します。\r\nステートメントは終了しました。」
一方向のマッピングが必要です。まだ提供されている答えは、双方向マッピングについてです。
NHibernate カスケード保存はネイティブ ID ジェネレーターで動作しますか?
DB テーブル:
BlogArticle{ID, Name}。ID の場合、Identity=true。
Comment{ID, Name, BlogArticleID}。ID の場合、Identity=true。
コメント.hbm.xml
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernate__OneToMany.BO"
namespace="NHibernate__OneToMany.BO"
default-access="property">
<class name="Comment" table="Comment">
<id name="ID">
<generator class="native" />
</id>
<property name="Name" />
</class>
</hibernate-mapping>
public class Comment
{
private int _id;
public virtual int ID
{
get { return _id; }
set { _id = value; }
}
public Comment()
{
}
public Comment(string name)
{
this._name = name;
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
}
ブログ記事.hbm.xml
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
namespace="NHibernate__OneToMany.BO"
assembly="NHibernate__OneToMany.BO"
default-access="property">
<class name="BlogArticle" table="BlogArticle">
<id name="ID">
<generator class="native" />
</id>
<property name="Name" column="Name" />
<bag name="Comments" cascade="all" >
<key column="BlogArticleID" />
<one-to-many class="Comment" />
</bag>
</class>
</hibernate-mapping>
public class BlogArticle
{
private int _id;
public virtual int ID
{
get { return _id; }
set { _id = value; }
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
private IList _depts;
public virtual IList Comments
{
get { return _depts; }
set { _depts = value; }
}
}
主要
class Program
{
static void Main(string[] args)
{
BlogArticle ba = new BlogArticle();
ba.Name = "Humanity";
ba.Comments = new List<Comment>();
ba.Comments.Add(new Comment("Comm1"));
ba.Comments.Add(new Comment("Comm2"));
ba.Comments.Add(new Comment("Comm3"));
Repository<BlogArticle> rep = new Repository<BlogArticle>();
rep.Save(ba);
}
}
リポジトリ
public class Repository<T> : IRepository<T>
{
ISession _session;
public Repository()
{
_session = SessionFactoryManager.SessionFactory.OpenSession();
}
private void Commit()
{
if (_session.Transaction.IsActive)
{
_session.Transaction.Commit();
}
}
private void Rollback()
{
if (_session.Transaction.IsActive)
{
_session.Transaction.Rollback();
//_session.Clear();
}
}
private void BeginTransaction()
{
_session.BeginTransaction();
}
public void Save(T obj)
{
try
{
this.BeginTransaction();
_session.Save(obj);
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
void IRepository<T>.Save(IList<T> objs)
{
try
{
this.BeginTransaction();
for (Int32 I = 0; I < objs.Count; ++I)
{
_session.Save(objs[I]);
}
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
void IRepository<T>.Update(T obj)
{
try
{
this.BeginTransaction();
_session.Update(obj);
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
void IRepository<T>.Update(IList<T> objs)
{
try
{
this.BeginTransaction();
for (Int32 I = 0; I < objs.Count; ++I)
{
_session.Update(objs[I]);
}
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
void IRepository<T>.Delete(T obj)
{
try
{
this.BeginTransaction();
_session.Delete(obj);
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
void IRepository<T>.Delete(IList<T> objs)
{
try
{
this.BeginTransaction();
for (Int32 I = 0; I < objs.Count; ++I)
{
_session.Delete(objs[I]);
}
this.Commit();
}
catch (Exception ex)
{
this.Rollback();
throw ex;
}
}
T IRepository<T>.Load<T>(object id)
{
return _session.Load<T>(id);
}
public IList<T> Get<T>(int pageIndex, int pageSize)
{
ICriteria criteria = _session.CreateCriteria(typeof(T));
criteria.SetFirstResult(pageIndex * pageSize);
if (pageSize > 0)
{
criteria.SetMaxResults(pageSize);
}
return criteria.List<T>();
}
public T Get<T>(object id)
{
return _session.Get<T>(id);
}
public IList<T> Get<T>()
{
return Get<T>(0, 0);
}
public IList<T> Get<T>(string propertyName, bool Ascending)
{
Order cr1 = new Order(propertyName, Ascending);
IList<T> objsResult = _session.CreateCriteria(typeof(T)).AddOrder(cr1).List<T>();
return objsResult;
}
public IList<T> Find<T>(IList<string> strs)
{
System.Collections.Generic.IList<NHibernate.Criterion.ICriterion> objs = new System.Collections.Generic.List<ICriterion>();
foreach (string s in strs)
{
NHibernate.Criterion.ICriterion cr1 = NHibernate.Criterion.Expression.Sql(s);
objs.Add(cr1);
}
ICriteria criteria = _session.CreateCriteria(typeof(T));
foreach (ICriterion rest in objs)
_session.CreateCriteria(typeof(T)).Add(rest);
criteria.SetFirstResult(0);
return criteria.List<T>();
}
public void Detach(T item)
{
_session.Evict(item);
}
}