使用fluent nhibernate自动映射在外键上添加多列唯一约束

使用fluent nhibernate自动映射在外键上添加多列唯一约束,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我是一个NHibernate和流利的NHibernate新手。我有一些关于唯一约束和nhibernate映射的问题 我得到了域模型的以下部分 public class Batch { public virtual int Id {get; set;} public virtual string Name {get; set;} public virtual IList<BatchParameter> BatchParameters {get; set;} }

我是一个NHibernate和流利的NHibernate新手。我有一些关于唯一约束和nhibernate映射的问题

我得到了域模型的以下部分

public class Batch
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual IList<BatchParameter> BatchParameters {get; set;}
}
public class BatchParameter
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual Batch Batch {get; set;}
}
公共类批处理
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList批处理参数{get;set;}
}
公共类BatchParameter
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟批处理{get;set;}
}
我正在尝试使用fluent nhibernate使用自动映射将其映射到db(SQLServer)上。 我想设置我的db,以便:

  • “Id”属性上的主键

  • BatchParameters表上的外键

  • 列名称上批处理表的唯一约束

  • BatchParameters表中列名称和批次Id的唯一约束

所以我写下了这段代码:

public class BatchMapping : IAutoMappingOverride<Batch>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<Batch> mapping)
    {
        mapping.Id( b => b.Id);
        mapping.HasMany<BatchParameter>(p => p.BatchParameters).Cascade.All().Inverse();
    }
}

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping)
    {
        mapping.Id( b => b.Id);
        mapping.Map(b => b.Name).Unique();
        //mapping.Map(p => p.Name).UniqueKey("Batch_Parameter");
        //mapping.Map(p => p.Batch.Id).UniqueKey("Batch_Parameter");
    }
}
公共类批处理映射:IAutoMappingOverride
{
公共无效覆盖(FluentNHibernate.Automapping.Automapping映射)
{
map.Id(b=>b.Id);
HasMany(p=>p.BatchParameters).Cascade.All().Inverse();
}
}
公共类BatchParameterMapping:IAutoMappingOverride
{
公共无效覆盖(FluentNHibernate.Automapping.Automapping映射)
{
map.Id(b=>b.Id);
Map(b=>b.Name).Unique();
//Map(p=>p.Name).UniqueKey(“Batch_参数”);
//Map(p=>p.Batch.Id).UniqueKey(“Batch_参数”);
}
}
主键、外键和第一个唯一约束没有问题。对于唯一的约束有点头疼

有人能告诉我直路吗


谢谢

如果Id和名称是BatchParameter表中的主键,则需要一个复合Id。此外,如果希望从BatchParameter类返回对Batch的引用,则需要使用引用。以下内容应接近您的需要:

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping)
    {
        mapping.CompositeId()
            .KeyProperty(x => x.Id)
            .KeyProperty(x => x.Name);

        mapping.References(x => x.Batch);
    }
}
公共类BatchParameterMapping:IAutoMappingOverride
{
公共无效覆盖(FluentNHibernate.Automapping.Automapping映射)
{
mapping.CompositeId()
.KeyProperty(x=>x.Id)
.KeyProperty(x=>x.Name);
mapping.References(x=>x.Batch);
}
}

首先,看起来您有一个复制粘贴错误:
映射(b=>b.Name).
应该进入
批映射
,而不是
批参数映射

public class BatchMapping : IAutoMappingOverride<Batch>
{
    public void Override(AutoMapping<Batch> mapping)
    {
        mapping.Map(b => b.Name).Unique();
    }
}
最后,您应该删除
Id
属性和
Batch.BatchParameters
的不必要映射。默认情况下,Fluent NHibernate的自动映射将根据需要对其进行映射。在
Override
方法中,您只需要指定与自动映射默认值不同的属性,例如指定唯一键

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(AutoMapping<BatchParameter> mapping)
    {
        mapping.Map(p => p.Name).UniqueKey("Batch_Parameter");
        mapping.References(p => p.Batch).UniqueKey("Batch_Parameter");
    }
}