Datetime 带日期的Fluent NHibernate复合键

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, [

我是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) )在[小学]

在我的域模型中,我有一个对应的实体:

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