次のように、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 の問題/制限であるかどうかはわかりません。どんな助けでも大歓迎です。