Ich versuche, eine Tabelle-pro-Hierarchie-Zuordnung mit NHibernate 2.0.1 zu erstellen. Ich habe eine Basisklasse mit Eigenschaften, die für jede Unterklasse existieren, von der andere Klassen erben. Alle diese Objekte werden in einer Tabelle mit dem Namen Nachrichten beibehalten, die alle möglichen Felder für jede Klasse enthalten. Es gibt eine SourceID, die der Diskriminator ist und angeben sollte, welches Poco für jede Unterklasse zurückgegeben werden soll. Hier ist meine aktuelle Zuordnung.Richtiges Zuordnen einer polymorphen Beziehung mit NHibernate
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NS.Core"
namespace="NS.Core.Model">
<class name="BaseMessage" table="Messages">
<id name="MessageID" type="Int64">
<column name="MessageID" />
<generator class="native" />
</id>
<discriminator column="SourceID" type="Int32"/>
<property name="DateCreated" access="property" column="DateCreated" type="DateTime" not-null="true"/>
<property name="DatePublished" access="property" column="DatePublished" type="DateTime"/>
<property name="SourceID" access="property" column="SourceID" type="Int32"/>
<many-to-one name="User" column="UserID" access="property" cascade="none" lazy="false" fetch="join" outer-join="true" />
<subclass name="NMessage" discriminator-value="0">
<property name="Body" access="property" column="Body" type="String"/>
</subclass>
<subclass name="BMessage" discriminator-value="1">
<property name="Title" access="property" column="Title" type="String"/>
<property name="Body" access="property" column="Body" type="String"/>
</subclass>
<subclass name="CMessage" discriminator-value="2">
<property name="Url" access="property" column="Url" type="String"/>
<property name="Body" access="property" column="Body" type="String"/>
</subclass>
</class>
</hibernate-mapping>
Ich erhalte eine Fehlermeldung, dass die Abfrage kann nicht Diskriminatorwert zu SQL-Zeichenfolge der Einheit NS.Core.Model.BaseMessage formatiert, damit ich auch auf dieser Klasse einen Diskriminatorwert setzen althout es sollte nie die Basisklasse zurück. Das hat mich zu einigen Fehlern geführt.
Werde ich dieses Problem falsch angehen? Ich möchte die Tabelle abfragen und eine Liste von verschiedenen POCOs zurückbekommen, die alle von der Basisklasse erben. Es würde nie die Basisklasse selbst zurückgeben.
unten ist die BaseMessage.cs
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
namespace NS.Core.Model
{
[Serializable]
[DataContract]
[KnownType(typeof(User))]
public class BaseMessage
{
#region Private variables
private long _messageID;
private DateTime? _dateCreated;
private DateTime? _datePublished;
private int _sourceID;
private User _user = new User();
#endregion
#region Properties
[DataMember]
public virtual long MessageID
{
get { return _messageID; }
set { this._messageID = value; }
}
[DataMember]
public virtual DateTime? DateCreated
{
get { return _dateCreated; }
set { this._dateCreated = value; }
}
[DataMember]
public virtual DateTime? DatePublished
{
get { return _datePublished; }
set { this._datePublished = value; }
}
[DataMember]
public virtual int SourceID
{
get { return _sourceID; }
set { this._sourceID = value; }
}
[DataMember]
public virtual User User
{
get
{
if (this._user != null)
{ return this._user; }
else { return new User(); }
}
set { this._user = value; }
}
#endregion
}
}
können Sie den Code für BaseMessage posten? – hackerhasid
aktualisiert.Hoffe es hilft – CountCet