Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nhibernate not null属性引用null或暂时值Tec.Core.Model.Budget.oInvestmentCode_C#_Xml_Nhibernate - Fatal编程技术网

C# Nhibernate not null属性引用null或暂时值Tec.Core.Model.Budget.oInvestmentCode

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

早上好

我对NHibernate很陌生。我想在我的新项目中使用它,但是我遇到了外键引用的问题。我不确定为什么会发生这个问题

显示的错误消息是:
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; }