这是试图将 null 插入 Comment.BlogArticleID。
出现以下 GenericADOException:“无法插入:[NHibernate__OneToMany.BO.Comment][SQL: INSERT INTO Comment (Name) VALUES (?); select SCOPE_IDENTITY()]”
出现以下内部异常:“无法将值 NULL 插入到列 'BlogArticleID'、表 'Relationships_Test_OneToMany.dbo.Comment';列不允许空值。插入失败。\r\n语句已终止。”
我需要一个单向映射。提供的答案是关于双向映射。
NHibernate 级联保存是否适用于本机 ID 生成器?
数据库表:
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);
}
}