頭から回路が焼けた独特の匂いがするので、私の無知を許してください。
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 の関係を設定するための何かが欠けていると思います。
私は何が欠けていますか?