use*_*312 2 nhibernate nhibernate-cascade
这是尝试在Comment.BlogArticleID中插入null.
出现以下GenericADOException:"无法插入:[NHibernate__OneToMany.BO.Comment] [SQL:INSERT INTO注释(名称)VALUES(?);选择SCOPE_IDENTITY()]"
出现以下内部异常:"无法将值NULL插入列'BlogArticleID',表'Relationships_Test_OneToMany.dbo.Comment';列不允许空值.INSERT失败.\ r \n语句已终止."
我需要一个单向映射.提供的答案还在谈论双向映射.
NHibernate级联保存是否适用于本机ID生成器?
BlogArticle {ID,Name},如果是ID,则Identitity = true.
注释{ID,Name,BlogArticleID},如果是ID,则Identitity = true.
<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; }
}
}
Run Code Online (Sandbox Code Playgroud)
<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; }
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
关联类的键列(Comment.BlogArticleID)必须在数据库中可为空.NHibernate将插入将此列留空的行,然后执行更新以设置密钥.
将not-null ="true"添加到key元素将不起作用,因为此属性仅由架构导出工具使用.
请注意,失败的插入包括为新子行生成的标识的选择.
| 归档时间: |
|
| 查看次数: |
3540 次 |
| 最近记录: |