2

У меня есть сценарий, где мне нужно определить две многоколончатыми уникальные ограничения, как так:Несколько UniqueKeys в Fluent NHibernate

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 и e-mail, чтобы быть уникальным каждый клиент. Полученный 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. Любая помощь будет оценена по достоинству.

ответ

1

Вызов 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")