私の頭には燃え尽きた回路がはっきりと見えるので、私の無知を許してください。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の関係を設定するために何かを逃したと推測している。
私には何が欠けていますか?
...私はあなたがおそらく.HasOneマッピングを必要としないという気持ちがある(実際には多対1の関係なので) – autonomatt