Frage

Jede Verwendung nHibernate mit einem Domain-Objekt & DTO-Objekt aus einer gemeinsamen Schnittstelle implementiert? Ich versuche, alle meine nHibernate Attribute in das Domain-Objekt zu trennen, meine DTO und Schnittstelle sauber zu verlassen.

Das Problem kommt mit nHibernate Fehler zu werfen, wenn es die Schnittstellen mit den konkreten Klassen zuzuordnen versucht.

NHibernate.MappingException: Verband Referenzen unmapped Klasse: IContact

Ich verstehe, warum sein über die Verwendung des nicht-hibernated Schnittstelle beschweren, aber ich bin zu kämpfen, um visuellen einen Weg, um sie zu restrukturieren. Ein Skelett Wiedergabe meines Code wird, wie nachstehend dargelegt, keine Ideen, wie mein Code besser zu strukturieren?

public interface ICompany
{
    IList<IContact> Contacts { get; set; }
}

public class CompanyDTO : ICompany
{
    private IList<IContact> contacts;
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }

}

[ActiveRecord]
public class Company : ActiveRecordBase<Company>, ICompany
{
    private IList<IContact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Edit:

Ich möchte eine gemeinsame Schnittstelle haben, so dass ich sicher, können sie die gleichen Felder halten (dh. Auf dem Compiler lehnt sie konsistent zu halten). Es ermöglicht auch mir die DTO in der Ansicht ein Teil meiner Anwendung zu verwenden, sondern wirft sie auf Domänenobjekte für Geschäfts- und Datenzugriff. Auch dann, wenn alex-Lösung nicht funktionieren, weil ICompany die Kontakte vom Typ IList ist, nicht IList. Ich möchte es als IContact halten, so mein DTO-Objekt keine Kenntnis von dem Kontakt Domain-Objekt hat.

War es hilfreich?

Lösung

In Ihrem konkreten Fall sollten Sie nur Type = typeof(Contact) zum Mapping Attribute hinzufügen, etwa so:

[HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]

Andere Tipps

Nun in Ihrer Domain können Sie nicht den IContract verwenden, anstatt auf Ihre Domain-Entity Konkrete Klasse zu verweisen. Wenn Sie Ihre Version verwenden korrigieren einfach:

[ActiveRecord]
public class Company : ActiveRecordBase<Company>
{
    private IList<Contact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<Contact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Ich sehe den Punkt nicht Ihre Domain und Ihre DTOs zu verbinden. Sie sind gekoppelt, und sie können nicht die gleichen Informationen haben. Zum Beispiel könnten Sie einige Informationen halten sehr weel in Ihre Domain gekapselt und nur kommunizieren einige andere Informationen. DTO werden aus den Daten, die Sie mit up-Schichten teilen wollen transfert.

können Sie haben Basisklasse Ihr Unternehmen und Ihre ValueObject zu definieren. Kurz Entity: DomainEntity sind ID können Mittel, die sie beibehalten werden können. ValueObject = DTO kann nicht beibehalten werden (nicht-ID können)

Sehen Sie sich das Core-Design von Sharp-Bogen:

  • /BaseObject.cs. Stellt grundlegende Aufgabe Vergleichsdienste
  • /Entity.cs: Liefert ein Objekt mit einer Domäne Unterschrift und eine typisierbarem ID-Eigenschaft. Dies hat auch die Validierung Unterstützung von NHibernate Validator. Gegenstände, die aus erstrecken Entity mindestens eine [DomainSignature] Eigenschaft MUSS haben; es wird ein Wurf Design-by-Contract Ausnahme, wenn diese verletzt wird. Die Schnittstelle IEntityWithTypedID können Sie Ihre eigene Rolle.
  • /ValueObject.cs: Dies ist ein Wertobjekt, bei dem alle seine Eigenschaften werden im Vergleich zu einem anderen Wert-Objekt verwendet. Objekte die sich von ValueObject keine [DomainSignature] haben Eigenschaften; es wird eine Design-by-Contract Ausnahme auslösen, wenn dies verletzt.

Und was soll ich tun, wenn ich [HasMany] zuschreiben? Es hat tatsächlich nicht Eigenschaftsname ‚Typ‘, aber [Eigenschaften] und [Gehört] diejenigen haben.

UPDATE

Die Antwort ist CollectionType = typeof(YourType) verwenden

UPDATE 2

Nein, es hat nicht funktioniert, wird diese Eigenschaft für Kollektionstyp eingestellt heißt Liste usw. auf [(typeof (meType), ...) HasMany] Der Versuch, aber immer noch nicht funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top