使用fluent nhibernate自动映射在外键上添加多列唯一约束
我是一个NHibernate和流利的NHibernate新手。我有一些关于唯一约束和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;} }
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");
}
}