2009-06-03 7 views
3

Ich bin neu in NHibernate und habe Schwierigkeiten mit einem einfachen aber stumpfen Fehler.Fluent NHibernate Composite-Schlüssel mit Daten

Ich habe eine Tabelle in meinem DB (MSSQL2008), wo der zusammengesetzte Schlüssel aus 2 Datumsspalten besteht.

Dies würde eine Zeitspanne StartDate und EndDate darstellen, die für die Zwecke meiner Lösung eindeutig ist.

Die Tabellendefinition ist als solche.

CREATE TABLE [dbo] [CompositeKeyTab] ( [KeyCol1] [Datum] NOT NULL, [KeyCol2] [Datum] NOT NULL, [Wert] [ decimal] (18, 0), NULL, CONSTRAINT [PK_CompositeKeyTab] PRIMARY KEY CLUSTERED ( [KeyCol1] ASC, [KeyCol2] ASC ) mit (PAD_INDEX = AUS, STATISTICS_NORECOMPUTE = AUS, IGNORE_DUP_KEY = AUS, ALLOW_ROW_LOCKS = EIN, ALLOW_PAGE_LOCKS = ON) EIN [PRIMÄR] ) EIN [PRIMÄR]

In meinem Domain-Modell habe ich eine entsprechende Einheit:

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

und in meinem Kartierungsaufbau einer Karte:

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

Alles OK kompiliert. Aber wenn ich versuche, eine Instanz meiner Klasse der DB bestehen bleiben (wie so)

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

ich:

"Unexpected Zeilenanzahl: 0; erwartet: 1"

Wenn Flush () wird auf der Sitzung aufgerufen.

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

Was mache ich falsch?

+0

Ich habe das gleiche Problem !!! –

Antwort

0

Ich hatte das gleiche Problem, ich fand, dass wenn Sie ein neues Element in die Datenbank hinzufügen, dann müssen Sie Save() aufrufen und wenn Sie ein Element aktualisieren, müssen Sie Update() aufrufen.

Aus irgendeinem Grund scheint es einen Fehler beim Aufruf von SaveOrUpdate() zu geben.

hoffe, das hilft

+2

Es ist kein Fehler - SaveOrUpdate verwendet den nicht gespeicherten Wert (z. B. Standard 0 für Identitätsfelder), um festzustellen, ob es sich um eine Einfügung oder Aktualisierung handelt. Es gibt keinen gültigen ungespeicherten Wert für diese Klasse, daher liegt es an der App. nennen Sie einfügen oder aktualisieren Sie entsprechend. –

3

ich glaube, das Problem ist, dass NHibernate nicht weiß, was der nicht gespeicherten Wert für Ihre zusammengesetzten Schlüssel ist, so dass es ein Update anstelle eines Einsatzes zur Ausgabe versucht, wenn Sie SaveOrUpdate() aufrufen. Ich sehe keine Möglichkeit für Sie, einen gültigen ungesicherten Wert für diese Klasse zu haben. Daher empfehle ich Ihnen, Ihr Repository zu ändern, um Save() und Update() separat zu implementieren und die entsprechende Methode aufzurufen.