C# Nhibernate not null属性引用null或暂时值Tec.Core.Model.Budget.oInvestmentCode
早上好 我对NHibernate很陌生。我想在我的新项目中使用它,但是我遇到了外键引用的问题。我不确定为什么会发生这个问题 显示的错误消息是:C# Nhibernate not null属性引用null或暂时值Tec.Core.Model.Budget.oInvestmentCode,c#,xml,nhibernate,C#,Xml,Nhibernate,早上好 我对NHibernate很陌生。我想在我的新项目中使用它,但是我遇到了外键引用的问题。我不确定为什么会发生这个问题 显示的错误消息是:notnull属性引用空值或临时值Tec.Core.Model.Budget.oInvestmentType 以下是我的表模式: 这是我的映射文件 机场 Airport.hbm.xml <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibe
notnull属性引用空值或临时值Tec.Core.Model.Budget.oInvestmentType
以下是我的表模式:
这是我的映射文件
机场
Airport.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Tec.Core.Model.Airport, Tec.Core" table="tblAirport" lazy="false">
<id name="ID" column="AirportID" unsaved-value="0">
<generator class="identity" />
</id>
<property name="AirportCode" column="AirportCode" />
<property name="AirportFullName" column="AirportFullName" />
<bag name="Budgets" table="tblBudget" inverse="true" cascade="save-update">
<key column="AirportID" />
<one-to-many class="Tec.Core.Model.Budget, Tec.Core" />
</bag>
</class>
</hibernate-mapping>
我不会把我的生命押在这上面。。但我要说的是,你的问题在这里:
public IList<Budget> Budgets {
get { return new List<Budget>(_lstinvestmentCodeBudgets).AsReadOnly(); }
protected set { _lstinvestmentCodeBudgets = value; }
}
objA
被持久化。。而objBg
也是级联和持久化的。这意味着NHiberante正在跟踪对objBg
的引用
那么你称之为:
objIC.AddBudget(objBg);
这会按预期将预算添加到列表中。让我们把这个列表称为“列表A”
然后,您可以调用save:
daoFactory.GetInvestmentCodeDao().Save(objIC);
当NHibernate开始从实体读取值时。。说到你的getter:
get { return new List<Budget>(_lstInvestmentTypeBudgets).AsReadOnly(); }
…看看这是否有效。应该。。因为您返回的是同一个实例。映射需要稍微更正。预算是一个实体,其构成参考了机场、投资和投资代码。预算不能像子类一样添加到其他类中,因为这里没有一对多关系。因此,请从三个类中删除addBudget方法,并将以下方法添加到
Budget
类->AddAirport、AddInvestmentCode、AddInvestmentType
。
更新:
另外,通过从Airport、Investment type和code中删除指向预算类的包来相应地更正映射我仍然有相同的问题事件,我通过修改InvestmentType.cs
public IList Budgets{get{//return new List中的代码更改了代码,正如您的建议(lstInvestmentTypeBudgets).AsReadOnly();return lstInvestmentTypeBudgets;}受保护的集合{{{lstInvestmentTypeBudgets=value;}}}
您能通过编码示例来指导我了解更多细节吗?
private string _investmentTypeNote="";
private IList<Budget> _lstInvestmentTypeBudgets = new List<Budget>();
private InvestmentType() { }
public InvestmentType(string InvestmentTypeNote){
this._investmentTypeNote = InvestmentTypeNote ;
}
public string InvestmentTypeNote {
get { return _investmentTypeNote ; }
set { _investmentTypeNote = value; }
}
public IList<Budget> Budgets {
get { return new List<Budget>(_lstInvestmentTypeBudgets).AsReadOnly(); }
protected set { _lstInvestmentTypeBudgets = value; }
}
public void AddBudget(Budget investment_type_budget) {
if (investment_type_budget != null && !_lstInvestmentTypeBudgets.Contains(investment_type_budget)){
investment_type_budget.oInvestmentType = this;
_lstInvestmentTypeBudgets.Add(investment_type_budget);
}
}
public override int GetHashCode(){
return (GetType().FullName + "|"+ _investmentTypeNote.GetHashCode()).GetHashCode();
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Tec.Core.Model.Budget, Tec.Core" table="tblBudget" lazy="false">
<id name="ID" column="BudgetID" unsaved-value="0">
<generator class="identity" />
</id>
<property name="BudgetAmount" column="BudgetAmount" />
<property name="BudgetYear" column="BudgetYear" />
<many-to-one name="oAirport" column="AirportID"
class="Tec.Core.Model.Airport, Tec.Core" not-null="true" />
<many-to-one name="oInvestmentCode" column="InvestmentCodeID"
class="Tec.Core.Model.InvestmentCode, Tec.Core" not-null="true" />
<many-to-one name="oInvestmentType" column="InvestmentTypeID"
class="Tec.Core.Model.InvestmentType, Tec.Core" not-null="true" />
</class>
</hibernate-mapping>
public class Budget:Entity<long>
{
private float _budgetAmount;
private int _budgetYear;
private InvestmentType _investmentType;
private InvestmentCode _investmentCode;
private Airport _airport;
public Budget() { }
public float BudgetAmount {
get{return _budgetAmount; }
set{_budgetAmount = value;}
}
public int BudgetYear {
get{return _budgetYear; }
set{_budgetYear = value;}
}
public Airport oAirport{
get{return _airport; }
set{_airport = value;}
}
public InvestmentType oInvestmentType{
get{return _investmentType; }
set{_investmentType = value;}
}
public InvestmentCode oInvestmentCode {
get{return _investmentCode ; }
set{_investmentCode = value;}
}
public override int GetHashCode(){
return (GetType().FullName + "|" + _airport.GetHashCode() +"|"+ _investmentCode.GetHashCode()+"|"+ _investmentType.GetHashCode()).GetHashCode();
}
}
Airport objA = new Airport("NA", "New Airport")
InvestmentCode objIC = new InvestmentCode("1000", "ABCD");
InvestmentType objIT = new InvestmentType("Capex");
Budget objBg = new Budget();
objBg.oAirport = objA;
objBg.oInvestmentCode = objIC;
objBg.oInvestmentType = objIT;
objBg.BudgetAmount = 10000;
objBg.BudgetYear = 2014;
objA.AddBudget(objBg);
AirportDao.SaveOrUpdate(objA);
objIC.AddBudget(objBg);
daoFactory.GetInvestmentCodeDao().Save(objIC); //Error occur here not-null property references a null or transient value Tec.Core.Model.Budget.oInvestmentType
objIT.AddBudget(objBg);
daoFactory.GetInvestmentTypeDao().Save(objIT);
public IList<Budget> Budgets {
get { return new List<Budget>(_lstinvestmentCodeBudgets).AsReadOnly(); }
protected set { _lstinvestmentCodeBudgets = value; }
}
objA.AddBudget(objBg);
AirportDao.SaveOrUpdate(objA);
objIC.AddBudget(objBg);
daoFactory.GetInvestmentCodeDao().Save(objIC);
get { return new List<Budget>(_lstInvestmentTypeBudgets).AsReadOnly(); }
get { return _lstInvestmentTypeBudgets; }