31

Fluent NHibernateに切り替えたところ、問題が発生しましたが、それに関する情報は見つかりませんでした。

これがケースです:

public class Field : DomainObject, IField
{
    public Field()
    {  
    }

    public virtual string Name { get; set; }
    public virtual string ContactPerson { get; set; }
    public virtual bool Private { get; set; }
    public virtual IAddress Address { get; set; }  
}

IAddressは、Addressという名前のクラスによって実装されるインターフェイスです。

public class Address : DomainObject, IAddress
{
    public Address()
    {
    }

    public virtual string City { get; set; }
    public virtual string Country { get; set; }
    public virtual string PostalCode { get; set; }
    public virtual string StreetAddress { get; set; }
}

これが両方のクラスのマッピングファイルです

住所

public class AddressMap : ClassMap<Address>
{   
    public AddressMap()
    {
        WithTable("Addresses");
        Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid();
        Map(x => x.City, "City");
        Map(x => x.Country, "Country");
        Map(x => x.PostalCode, "PostalCode");
        Map(x => x.StreetAddress, "StreetAddress");
    }
}

分野

public class FieldMap : ClassMap<Field>
{
    public FieldMap()
    {
        WithTable("Fields");
        Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid();
        Map(x => x.Name, "Name");
        Map(x => x.ContactPerson, "ContactPerson");
        Map(x => x.Private, "Private");
        References(x => x.Address, "AddressId").Cascade.Delete().Cascade.SaveUpdate();
    }
}

そのため、データベースからフィールドオブジェクトを取得しようとすると、IAddressがマップされていないことを示すNHibernateエラーが発生します。マッピングでAddressクラスを使用するようにNHibernateに指定する方法はありますか?

さらに情報が必要な場合はお知らせください。

どうもありがとう、

チャールズ

4

3 に答える 3

36

具象クラスの代わりにインターフェイスをプロパティとして使用する正当な理由があることがわかりました。

たとえば、Field クラスが Address クラスとは別のプロジェクトにあり、Field クラスのプロジェクトから Address クラスのプロジェクトに依存していなかったとします。

この状況に対処する方法は他にもありますが、多くの場合、最も簡単な方法は、実行していることを試して、IAddress に使用する具象クラスを NHibernate に明示的に伝えることです。

次のように、Fluent NHibernate でこれを実行できるようになりました。

References(x => x.Address, "AddressId")
    .Class(typeof(Address);

残念ながら、HasMany または HasManyToMany でこれを行うことはできません。C# で適切な共分散がサポートされていないため、これが可能かどうかはわかりません。

于 2010-01-22T00:28:59.353 に答える
5

Field オブジェクトには、IAddress 型のオブジェクトがあります。これは、任意の数の異なる実装によって実装できます。あなたが求めていることでは、各実装には独自のマッピングがあり、NHibernate が処理するのにいくつもの困難 (不可能?) が発生します。

簡単な例は、デモンストレーションに役立ちます。Address1 と Address2 の 2 つの IAddress 実装があるとします。それらはそれぞれ、独自のテーブル tblAddress1 および tblAddress2 に保存されます。Field オブジェクトを読み込もうとすると、NHibernate が認識しているのは、IAddress を実装する何かがあるということだけであり、どの実装が永続化されたかはわかりません。特定のフィールドの子オブジェクトを取得するために使用するマッピングをどのように知るのでしょうか?

もっと複雑なことはあると思いますが、この例は、宣言した正確なタイプのオブジェクトのマッピングが必要な理由を示しています。

于 2009-03-25T20:41:37.893 に答える
0

ORM をドメイン レイヤーから完全に切り離し、具体的なクラスを指定するのではなく、データ レイヤー全体でインターフェイスを参照することに関心がある場合は、EmptyInterceptor を実装して 2 つをマッピングできます。

ここで私の答えを見てください。

于 2014-02-17T10:02:42.797 に答える