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();
}