C# NHibernate级联未设置外键

C# NHibernate级联未设置外键,c#,nhibernate,C#,Nhibernate,正如标题所述,父项和子项都被插入到数据库中,但没有被链接 映射请求 <class name="Request" table="Requests"> <id name="RequestId"> <generator class="native" /> </id> <many-to-one name="BulkReport" class="BulkReport" column="BulkId" cascade="none" lazy="p

正如标题所述,父项和子项都被插入到数据库中,但没有被链接

映射请求

  <class name="Request" table="Requests">
<id name="RequestId">
  <generator class="native" />
</id>
<many-to-one name="BulkReport" class="BulkReport" column="BulkId" cascade="none" lazy="proxy" />
<property name="RunNumber" />
<property name="MobileNumber" />
<property name="Message" />
<property name="RequestedOn" />
<property name="Closed" />

<many-to-one name="Communication" class="Communication" column="CommId" cascade="save-update" lazy="proxy" />
<many-to-one name="Outcome" class="Outcome" column="OutcomeId" cascade="none" lazy="proxy" />
<many-to-one name="Discount" class="Discount" column="Discount" not-found="ignore" cascade="save-update" lazy="proxy" />
</class>
知道为什么会这样吗?对这件事有完整的了解吗

编辑:请求的信息

折扣班

    public class Discount
{
    public virtual int DiscountId { get; set; }
    public virtual double MobileNumber { get; set; }
    public virtual string CustomerName { get; set; }
    public virtual DateTime AddedOn { get; set; }
    public virtual bool Status { get; set; }
    public virtual bool Pending { get; set; }

    public virtual DiscountProduct Product { get; set; }
    public virtual User AddedBy { get; set; }

    public override string ToString()
    {
        return "0" + MobileNumber + ", " + CustomerName.Trim();
    }
}
请求类

    public class Request
{
    public virtual int RequestId { get; set; }
    public virtual BulkReport BulkReport { get; set; }
    public virtual int RunNumber { get; set; }
    public virtual double MobileNumber { get; set; }
    public virtual string Message { get; set; }
    public virtual DateTime RequestedOn { get; set; }
    public virtual Outcome Outcome { get; set; }
    public virtual bool Closed { get; set; }
    public virtual Communication Communication { get; set; }
    public virtual Discount Discount { get; set; }
}
测试我运行

        [Test]
    public void Can_add_new_request_with_discount()
    {
        ISession session = _sessionFactory.OpenSession();

        BulkReport report = session.Get<BulkReport>(1);
        Outcome outcome = session.Get<Outcome>(1);
        User user = session.Get<User>("Test");
        DiscountProduct discountProduct = session.Get<DiscountProduct>(1);


        Request request = new Request()
        {
            Message = "Test Request",
            BulkReport = report,
            Closed = true,
            MobileNumber = 07000000000,
            RequestedOn = DateTime.Now,
            RunNumber = 100,
            Outcome = outcome
        };

        Discount discount = new Discount
            {
                AddedBy = user,
                AddedOn = DateTime.Now,
                CustomerName = "Test",
                MobileNumber = 07000000000,
                Pending = false,
                Status = true,
                Product = discountProduct
            };

        request.Discount = discount;

        session.Save(request);

        var fromDbRequest = session.Get<Request>(request.RequestId);
        var fromDbDiscount = session.Get<Discount>(discount.DiscountId);

        Assert.IsNotNull(fromDbRequest);
        Assert.IsNotNull(fromDbDiscount);
        Assert.AreEqual(request.MobileNumber, fromDbRequest.MobileNumber);
        Assert.AreEqual(discount.MobileNumber, fromDbDiscount.MobileNumber);

        session.Close();
    }
[测试]
public void可以添加带有折扣的新请求
{
ISession session=_sessionFactory.OpenSession();
BulkReport report=session.Get(1);
结果=session.Get(1);
User=session.Get(“测试”);
折扣产品折扣产品=会话.Get(1);
请求=新请求()
{
Message=“测试请求”,
批量报告=报告,
关闭=正确,
MobileNumber=07000000000,
RequestedOn=DateTime。现在,
RunNumber=100,
结果=结果
};
折扣=新折扣
{
AddedBy=用户,
AddedOn=日期时间。现在,
CustomerName=“测试”,
MobileNumber=07000000000,
挂起=错误,
状态=真,
产品=折扣产品
};
请求折扣=折扣;
会话。保存(请求);
var fromDbRequest=session.Get(request.RequestId);
var fromDbDiscount=session.Get(discount.DiscountId);
Assert.IsNotNull(fromDbRequest);
Assert.IsNotNull(fromdbpriff);
Assert.AreEqual(request.MobileNumber,fromDbRequest.MobileNumber);
Assert.AreEqual(discount.MobileNumber,fromDbDiscount.MobileNumber);
session.Close();
}

那个测试看起来是错误的。您确实应该使用事务(并调用
transaction.Commit()
)。或者,调用
session.Flush()
。如果您这样做,您很可能会得到一条update语句,该语句在
请求中设置
折扣


与您的问题无关,但您应该打开一个新会话以从DB
对象获取
,否则不会发出DB请求,因为它们已经在会话的一级缓存中,该测试看起来是错误的。您确实应该使用事务(并调用
transaction.Commit()
)。或者,调用
session.Flush()
。如果您这样做,您很可能会得到一条update语句,该语句在
请求中设置
折扣


与您的问题无关,但您应该打开一个新会话以从DB中获取
对象,否则不会发出DB请求,因为它们已经在会话的一级缓存中,而不是在我使用的架构中?它引入了什么版本?对不起,我刚刚意识到,
multi-to-one
上没有一个版本。你们有打折吗?如果是,它是什么类型的集合?上面未映射来自折扣->请求的引用。折扣未映射到请求,只是从请求到折扣的一种方式需要它。每次折扣仅会有一个请求,但在您保存(并期望FK结转)时,不会请求所有折扣(一些手动输入系统),您是保存折扣还是保存请求?另外,您正在调用
会话.Save
合并
?我使用类似映射运行的每个测试都运行良好。如果您只发布折扣和请求对象的最低版本,也可能会有所帮助。我已经用折扣和请求类更新了这个问题,还有我正在使用的模式中没有的测试?它引入了什么版本?对不起,我刚刚意识到,
multi-to-one
上没有一个版本。你们有打折吗?如果是,它是什么类型的集合?上面未映射来自折扣->请求的引用。折扣未映射到请求,只是从请求到折扣的一种方式需要它。每次折扣仅会有一个请求,但在您保存(并期望FK结转)时,不会请求所有折扣(一些手动输入系统),您是保存折扣还是保存请求?另外,您正在调用
会话.Save
合并
?我使用类似映射运行的每个测试都运行良好。如果您只发布折扣和请求对象的最低版本,这也可能会有所帮助。我已使用折扣和请求类以及测试更新了问题,我相信我没有看到所有其他测试都像您所说的那样进行。过于关注数据库和映射,而不是代码。我不相信我没有看到所有其他的测试都像你说的那样进行了。过于关注数据库和映射,而不是代码。谢谢
    public class Request
{
    public virtual int RequestId { get; set; }
    public virtual BulkReport BulkReport { get; set; }
    public virtual int RunNumber { get; set; }
    public virtual double MobileNumber { get; set; }
    public virtual string Message { get; set; }
    public virtual DateTime RequestedOn { get; set; }
    public virtual Outcome Outcome { get; set; }
    public virtual bool Closed { get; set; }
    public virtual Communication Communication { get; set; }
    public virtual Discount Discount { get; set; }
}
        [Test]
    public void Can_add_new_request_with_discount()
    {
        ISession session = _sessionFactory.OpenSession();

        BulkReport report = session.Get<BulkReport>(1);
        Outcome outcome = session.Get<Outcome>(1);
        User user = session.Get<User>("Test");
        DiscountProduct discountProduct = session.Get<DiscountProduct>(1);


        Request request = new Request()
        {
            Message = "Test Request",
            BulkReport = report,
            Closed = true,
            MobileNumber = 07000000000,
            RequestedOn = DateTime.Now,
            RunNumber = 100,
            Outcome = outcome
        };

        Discount discount = new Discount
            {
                AddedBy = user,
                AddedOn = DateTime.Now,
                CustomerName = "Test",
                MobileNumber = 07000000000,
                Pending = false,
                Status = true,
                Product = discountProduct
            };

        request.Discount = discount;

        session.Save(request);

        var fromDbRequest = session.Get<Request>(request.RequestId);
        var fromDbDiscount = session.Get<Discount>(discount.DiscountId);

        Assert.IsNotNull(fromDbRequest);
        Assert.IsNotNull(fromDbDiscount);
        Assert.AreEqual(request.MobileNumber, fromDbRequest.MobileNumber);
        Assert.AreEqual(discount.MobileNumber, fromDbDiscount.MobileNumber);

        session.Close();
    }