2016-11-23 3 views
0

Nehmen Sie die folgenden zwei Entitäten: -NHibernate Navigation Immobilien zum Verbinden nur

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 
} 

public class ProductDescription 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 

    public virtual string Description { get; set; } 
} 

Diese beiden Einheiten sind durch ItemId verwandt, aber es ist nicht immer ein Product für jeden ItemId, die gegen ein Produkt gelagert wird.

Ich möchte eine ProductDescription-Navigationseigenschaft in der Product-Entität einrichten, die ich dann in HQL verwenden kann, um Joins usw. auf die gleiche Weise auszuführen wie jede andere Navigationseigenschaft. Ich will nicht, dass es einen ausländischen Schlüssel oder irgendeine erzwungene Beziehung gibt.

Mein Versuch am Handeln war wie folgt: -

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId => ProductDescription?.ItemId; 

    public virtual ProductDescription ProductDescription { get; set; } 
} 

public class ProductMap 
{ 
    public ProductMap() 
    { 
     Id(x => x.Id); 
     References(x => x.ProductDescription).Not.Nullable().Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none"); 
    } 
} 

Das funktionierte absolut in Ordnung, wenn sie mit der Navigationseigenschaft arbeiten, wie ich aus der Datenbank vorhandenen Daten zu lesen erwarten würde, wenn es darum geht, etc. verbindet

Mein ungelöstes Problem betrifft die Persistenz von Produkten. Wenn ich ein Produkt speichere, möchte ich nicht, dass es etwas mit seiner Beziehung zu ProductDescriptions zu tun hat. Ich möchte nur, dass ItemId gespeichert wird und ob und wann eine ProductDescription mit der passenden ItemId beibehalten wird Die Navigationseigenschaft sollte funktionieren.

bei Persistenz Mein Versuch war wie folgt: -

new Product 
{ 
    ProductDescription = new ProductDescription { ItemId = "SomeId" } 
} 

Und das scheint absolut in Ordnung zu arbeiten, bis ich versuche, die ItemId auf Produkt nicht nullable machen, an welcher Stelle ich die üblichen Fehler, den Sie erhalten, erhalten, wenn Sie haben Inverse() auf der anderen Seite nicht die Relation gesetzt. Aber selbst wenn ich eine HasMany-Beziehung für ProductDescription mit Inverse erstellt habe, konnte das Problem nicht gelöst werden.

Ich hoffe, dass das oben skizziert, was ich versuche zu tun. Ich kann es fast genau so funktionieren lassen, wie ich es möchte, außer dass ich gezwungen bin, die ItemId auf Product NULL zu setzen.

Irgendwelche Ideen, um das zu lösen?

Antwort

0

schien es gelöst zu haben.

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 

    public virtual ProductDescription ProductDescription { get; protected set; } 
} 

public class ProductMap 
{ 
    public ProductMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.ItemId).Not.Nullable(); 
     References(x => x.ProductDescription).Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none").ReadOnly(); 
    } 
} 

Dies ermöglicht es mir die Artikel-ID auf beiden Seiten der Beziehung frei und Zwang, ohne zu setzen. Die Navigationseigenschaft funktioniert auch wie erwartet.