2

次のように、2 つの複数列の一意の制約を定義する必要があるシナリオがあります。

public class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        mapping.Map(x => x.UserName)
               .UniqueKey("UQ_User_UserName_Client");
        mapping.Map(x => x.LoweredEmail)
               .UniqueKey("UQ_User_Email_Client");
        mapping.References(x => x.Client)
               .UniqueKey("UQ_User_UserName_Client")
               .UniqueKey("UQ_User_Email_Client");
    }
}

この理由は、UserName と Email の両方をクライアントごとに一意にする必要があるためです。結果の SQL は次のようになります。

create table Users (
   Id UNIQUEIDENTIFIER not null,
   UserName NVARCHAR(256) not null,
   LoweredEmail NVARCHAR(256) not null,
   Email NVARCHAR(256) not null,
   ClientId UNIQUEIDENTIFIER null,
   primary key (Id),
   unique (UserName),
   unique (LoweredEmail, ClientId)
)

これは望ましい効果ではありません。次の SQL を作成するにはどうすればよいですか?

create table Users (
   Id UNIQUEIDENTIFIER not null,
   UserName NVARCHAR(256) not null,
   LoweredEmail NVARCHAR(256) not null,
   Email NVARCHAR(256) not null,
   ClientId UNIQUEIDENTIFIER null,
   primary key (Id),
   unique (UserName, ClientId),
   unique (LoweredEmail, ClientId)
)

これが Fluent または NHibernate の問題/制限であるかどうかはわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

2

複数回呼び出すUniqueKeyと、以前の値が上書きされます。

代わりに、一意のキーのカンマ区切りリストを使用します。

mapping.Map(x => x.UserName)
       .UniqueKey("UQ_User_UserName_Client");
mapping.Map(x => x.LoweredEmail)
       .UniqueKey("UQ_User_Email_Client");
mapping.References(x => x.Client)
       .UniqueKey("UQ_User_UserName_Client, UQ_User_Email_Client")
于 2012-06-07T23:51:38.260 に答える