2017-04-13 1 views
0

Ein wenig Kontext:Fluent NHibernate: Wie werden Fremdschlüssel mit HasMany gesetzt, eingefügt oder aktualisiert?

Ich habe viele Fälle von SomeCollection die Rule Informationen viele speichern, die an die Datenbank beibehalten werden muss. Jede Rule in der Datenbank hat eine automatisch inkrementierte ID (PK) und eine benutzerdefinierte RuleId. Die Rule Tabelle enthält auch einen Fremdschlüssel, der die ID der Sammlung ist. Die Tabelle Rule enthält eine eindeutige Integritätsbedingung für RuleId und CollectionId.


Frage:

  1. Wie werden Fremdschlüssel in Tabellen eingefügt, wenn sie mit HasMany abgebildet wird, nachdem das Kind aktualisiert wird eingefügt? Ich frage, wie Null in den Nachrichten unten angezeigt wird, aber ich weiß, dass die Werte festgelegt sind

  2. Wenn das Obige wahr oder falsch ist, wie kann ich mehrspaltige eindeutige Einschränkung erzwingen und das unten beschriebene Problem vermeiden.

Wenn ich die eindeutige Einschränkung in SomeCollectionMapping erzwingen, ich die folgende Verletzung:

FCE erkannt: System.Data.SqlClient.SqlException (0x80131904): Verletzung der UNIQUE KEY Einschränkung ' UQ__supporte__4D7ABD34DC8C8A20 '. Kann keinen doppelten Schlüssel in Objekt 'dbo.rules' einfügen. Der doppelte Schlüsselwert ist (123, NULL).

Die Daten werden versuchen, Einfügen ist:

123, myId1 
123, myId2 

Wenn ich die Zeilen weglassen: part.Not.Nullable() und part.UniqueKey("uniqueRef") die Daten erfolgreich in beiden Tabellen eingefügt wird, sondern erzwingt nicht die Einzigartigkeit.

Obwohl die Einfügung mit Fluent NHibernate fehlschlägt, bin ich in der Lage, Daten mit Microsoft SQl Server Management Studio ohne Probleme einzufügen, und die mehrspaltige Einschränkung funktioniert einwandfrei.



SomeCollection.cs

internal class SomeCollection 
{ 
    public SomeCollection() 
    { 
     this.CollectionId = string.Empty; 
     this.CollectionName = string.Empty; 
     this.Rules = new List<Rule>(); 
    } 

    public virtual string CollectionId { get; set; } 

    public virtual string CollectionName { get; set; } 

    public virtual IList<Rule> Rules { get; set; } 
} 

Rule.cs

internal class Rule 
{ 
    public Rule() 
    { 
     this.DisplayName = string.Empty; 
     this.RuleId = string.Empty; 
     this.MyValue = 0; 
    } 

    public virtual string DisplayName { get; set; } 

    public virtual string RuleId { get; set; } 

    public virtual int MyValue { get; set; } 
} 

SomeCollectionMapping.cs

internal sealed class SomeCollectionMapping : ClassMap<SomeCollection> 
{ 
    private const string TableName = "some_collections"; 

    public SomeCollectionMapping() 
    { 
     this.Table(TableName); 

     this.Id(x => x.CollectionId) 
      .Not.Nullable() 
      .Column("collectionId") 
      .UniqueKey("abc123"); 

     this.Map(x => x.CollectionName) 
      .Column("name") 
      .Not.Nullable(); 

     this.HasMany<Rule>(x => x.Rules) 
      .KeyColumns.Add("collectionId", part => 
      { 
       // No violations if I omit these two lines 
       part.Not.Nullable(); 
       part.UniqueKey("uniqueRef"); 
      }) 
      .Cascade.All(); 
    } 
} 

RuleMapping.cs

internal sealed class RuleMapping : ClassMap<Rule> 
{ 
    private const string TableName = "rules"; 

    public RuleMapping() 
    { 
     this.Table(TableName); 

     this.Id().GeneratedBy.Increment().Unique(); 

     this.Map(x => x.RuleId) 
      .Not.Nullable() 
      .UniqueKey("uniqueRef") 
      .Column("ruleId"); 

     this.Map(x => x.DisplayName) 
      .Column("name") 
      .Not.Nullable(); 

     this.Map(x => x.MyValue) 
      .Column("myValue") 
      .Not 
      .Nullable(); 
    } 
} 

Nhibernate 4.1.1 FluentNHibernate 2.0.3.0 SQLServer

+0

Meine eigene Antwort hinzugefügt, die alle Probleme behoben zu haben scheint, aber es beantwortet nicht wirklich meine Hauptfrage warum. Fühlen Sie sich frei, weiter beizutragen. Vielen Dank. – BlackBox

+0

Haben Sie [dieses] (/ q/11468668/1178314) gesehen? –

Antwort

0

Rechts.

Nachdem ich zufällig Dinge probiert habe, habe ich Not.KeyNullable() zur HasMany Kette hinzugefügt. Die Daten werden jetzt korrekt eingefügt und es werden keine Ausnahmen ausgelöst. Die eindeutigen und not null Einschränkungen funktionieren gut.

Dies scheint eine Lösung zu sein, aber wenn jemand anderes mit mehr Details antworten möchte, werde ich diese stattdessen gerne annehmen und akzeptieren.

Verwandte Themen