Datetime 带日期的Fluent NHibernate复合键
我是NHibernate的新手,我遇到了一个简单但stuborn的错误 我在数据库(MSSQL2008)中有一个表,其中复合键由2个日期列组成 对于我的解决方案来说,这将代表一个唯一的时间段StartDate和EndDate 表格定义如下: 创建表[dbo]。[CompositeKeyTab]( [KeyCol1][date]不为空, [KeyCol2][date]不为空, [值][十进制](18,0)空, 约束[PK_CompositeKeyTab]主键群集 ( [KeyCol1]ASC, [KeyCol2]ASC )在[主]上打开(PAD\u INDEX=OFF,STATISTICS\u norecocomputer=OFF,IGNORE\u DUP\u KEY=OFF,ALLOW\u ROW\u LOCKS=ON,ALLOW\u PAGE\u LOCKS=ON) )在[小学] 在我的域模型中,我有一个对应的实体:Datetime 带日期的Fluent NHibernate复合键,datetime,fluent-nhibernate,key,composite,Datetime,Fluent Nhibernate,Key,Composite,我是NHibernate的新手,我遇到了一个简单但stuborn的错误 我在数据库(MSSQL2008)中有一个表,其中复合键由2个日期列组成 对于我的解决方案来说,这将代表一个唯一的时间段StartDate和EndDate 表格定义如下: 创建表[dbo]。[CompositeKeyTab]( [KeyCol1][date]不为空, [KeyCol2][date]不为空, [值][十进制](18,0)空, 约束[PK_CompositeKeyTab]主键群集 ( [KeyCol1]ASC, [
public class CompositeKeyEnt
{
public virtual DateTime KeyCol1 { get; set; }
public virtual DateTime KeyCol2 { get; set; }
public virtual decimal Val { get; set; }
public override bool Equals(object obj)
{
var compareTo = obj as FinancialDay;
if (compareTo == null)
return false;
return this.GetHashCode() == compareTo.GetHashCode();
}
public override int GetHashCode()
{
return this.KeyCol1.GetHashCode() ^ this.KeyCol2.GetHashCode();
}
}
在我的映射程序集中有一个映射:
public class CompositeKeyEntMap: ClassMap<CompositeKeyEnt>
{
public CompositeKeyEntMap()
{
WithTable("CompositeKeyTab");
UseCompositeId().WithKeyProperty(e => e.KeyCol1, "KeyCol1").WithKeyProperty(e => e.KeyCol2, "KeyCol2");
Map(e => e.Val, "Value");
}
}
我做错了什么?我也遇到了同样的问题,我发现如果要将新项目添加到数据库中,则需要调用Save(),如果要更新项目,则需要调用Update() 出于某种原因,调用SaveOrUpdate()时似乎存在错误
希望这有帮助我认为问题在于NHibernate不知道复合键的未保存值是什么,因此在调用SaveOrUpdate()时,它会尝试发出更新而不是插入。我看不出有任何可能为该类提供有效的未保存值,因此我建议您修改存储库以分别实现Save()和Update(),并调用相应的方法。这不是一个bug——SaveOrUpdate使用未保存的值(例如,标识字段的默认值0)来确定它是插入还是更新。此类没有有效的未保存值,因此由应用程序决定。适当地调用insert或update。
CompositeKeyEnt cke = new CompositeKeyEnt() { KeyCol1 = DateTime.Now.AddDays(1), KeyCol2=DateTime.Now.AddDays(1), Val = 2.2M };
CompositeKeyEnt cke1 = new CompositeKeyEnt() { KeyCol1 = DateTime.Now, KeyCol2 = DateTime.Now, Val = 1.1M };
Repository<CompositeKeyEnt> crep = new Repository<CompositeKeyEnt>();
crep.SaveOrUpdate(cke);
crep.SaveOrUpdate(cke1);
public virtual T SaveOrUpdate(T entity)
{
using (var context = Session)
{
context.SaveOrUpdate(entity);
context.Flush(); //Exception raised here!!!
}
return entity;
}