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:
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 sindWenn 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
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
Haben Sie [dieses] (/ q/11468668/1178314) gesehen? –