流畅的NHibernate复合键与日期

时间:2009-06-03 08:43:21

标签: datetime fluent-nhibernate key composite

我是NHibernate的新手,我遇到了一个简单但非常困难的错误。

我的数据库(MSSQL2008)中有一个表,其中复合键由2个日期列组成。

这些代表StartDate和EndDate的时间段,对于我的解决方案来说,它是唯一的。

表定义如下:

CREATE TABLE [dbo]。[CompositeKeyTab](     [KeyCol1] [date] NOT NULL,     [KeyCol2] [date] NOT NULL,     [Value] [decimal](18,0)NULL,  CONSTRAINT [PK_CompositeKeyTab] PRIMARY KEY CLUSTERED (     [KeyCol1] ASC,     [KeyCol2] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )[主要]

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

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

一切都编好了。但是当我尝试将我的类的实例持久化到DB(如此)

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

我明白了:

“意外的行数:0;预期:1”

在会话中调用Flush()时。

    public virtual T SaveOrUpdate(T entity)
    {
        using (var context = Session)
        {
            context.SaveOrUpdate(entity);
            context.Flush(); //Exception raised here!!!
        }
        return entity;
    }

我做错了什么?

2 个答案:

答案 0 :(得分:3)

我认为问题在于NHibernate不知道复合键的未保存值是什么,因此当您调用SaveOrUpdate()时它会尝试发出更新而不是插入。我认为没有任何可能为此类提供有效的未保存值,因此我建议您修改存储库以单独实现Save()和Update()并调用适当的方法。

答案 1 :(得分:0)

我遇到了同样的问题,我发现如果要在数据库中添加新项目,则需要调用Save(),如果要更新项目,则需要调用Update()。

出于某种原因,调用SaveOrUpdate()似乎存在错误。

希望这有帮助