0

私の頭には燃え尽きた回路がはっきりと見えるので、私の無知を許してください。S#arpアーキテクチャの1対1マッピング

私は、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; } 
    ... 
} 

を持っていると私のDBスキーマが

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.D ata.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の関係を設定するために何かを逃したと推測している。

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

答えて

0

これは実際にはNHibernateのFluentの構文で解決するためのNHibernateの問題ですが、S#には関係があります。

背景読み:NHibernate MappingFluent NHibernate HasOne

あなたがどのようなユーザーのためのマッピングを上書きして、それを2つの.HasOneマッピングを与えています。そして、プロフィールやバスケットクラス上のユーザに固有の参照を設定:サイドノートとして

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#で作業するのに非常に便利です。

+0

...私はあなたがおそらく.HasOneマッピングを必要としないという気持ちがある(実際には多対1の関係なので) – autonomatt

関連する問題