0

頭から回路が焼けた独特の匂いがするので、私の無知を許してください。

S#arp Architecture で 1 対 1 の関係をセットアップしようとしています (Automapper に任せてください)。

私は持っている

public class User : Entity
{
    public virtual Profile Profile { get; set; }
    public virtual Basket Basket { get; set; }
    public virtual IList<Order> Orders { get; set; }
    public virtual IList<Role> Roles { get; set; }  
    ...
}

public class Basket : Entity
{
    public virtual User User { get; set; }  
    ...
}

public class Profile : Entity
{
    public virtual User User { get; set; }
    ...
}

そして、私のデータベーススキーマは

CREATE TABLE [dbo].[Users](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    ...

CREATE TABLE [dbo].[Profiles](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserFk] [int] NULL,
    ...

CREATE TABLE [dbo].[Baskets](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserFk] [int] NULL,
    ...

MappingIntegrationTests で単体テスト CanConfirmDatabaseMatchesMappings を実行すると、次のエラーが表示されます

NHibernate.ADOException : クエリを実行できませんでした ... System.Data.SqlClient.SqlException : 列名 'ProfileFk' が無効です。列名「BasketFk」が無効です。

実行しようとしているSQLは

SELECT TOP 0
    this_.Id AS Id6_1_ ,
    ..
    user2_.ProfileFk AS ProfileFk9_0_ ,
    user2_.BasketFk AS BasketFk9_0_
FROM
    Profiles this_
    LEFT OUTER JOIN Users user2_
        ON this_.UserFk = user2_.Id

そのため、Users テーブルで ProfileFk フィールドと BasketFk フィールドを探しています。私はカスタマー オーバーライド マッピングを設定していません。私が確認できる限り、S# で設定されている既定の規則に従っています。

IList Orders と Roles の他の 2 つのマッピングは、適切にマッピングされているようです。ですから、1 対 1 の関係を設定するための何かが欠けていると思います。

私は何が欠けていますか?

4

1 に答える 1

0

とった。これは実際には Fluent NHibernate 構文で解決する NHibernate の問題ですが、たまたま S# に関連しています。

背景資料: NHibernate MappingFluent NHibernate HasOne

ユーザーのマッピングをオーバーライドし、2 つの .HasOne マッピングを指定します。次に、Profile および Basket クラスでユーザーへの一意の参照を設定します。

public class UserMap : IAutoMappingOverride<User>
    {
        #region Implementation of IAutoMappingOverride<User>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<User> mapping)
        {
            mapping.HasOne(u => u.Profile);
            mapping.HasOne(u => u.Basket);
        }
        #endregion
    }

public class ProfileMap : IAutoMappingOverride<Profile>
    {
        #region Implementation of IAutoMappingOverride<Profile>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Profile> mapping)
        {
            mapping.References(p => p.User).Unique().Column("UserFk");
        }
        #endregion
    }

public class BasketMap : IAutoMappingOverride<Basket>
    {
        #region Implementation of IAutoMappingOverride<Basket>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Basket> mapping)
        {
            mapping.References(b => b.User).Unique().Column("UserFk");
        }
        #endregion
    }

ちなみに、これを書いている時点では、NHibernate 3 がリリースされたばかりです。私が購入したばかりのNHibernate 3.0 Cookbookという素晴らしい本があり、S# での作業に非常に役立ちそうです。

于 2010-12-07T14:45:31.427 に答える