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

时间:2010-01-13 09:26:01

标签: 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 BatchParameter
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual Batch Batch {get; set;}
}

我正在尝试使用fluent-nhibernate使用自动化将其映射到db(SQLServer)上。 我想设置我的数据库以便:

  • “Id”属性上的主键

  • BatchParamets表上的外键

  • 列名称

  • 上的批处理表上的唯一约束
  • 列Name和Batch_Id上的BatchParameters表上的唯一约束

所以我写下了这段代码:

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");
    }
}

主键,外键和第一个唯一约束没有问题。对于Unique Constraint来说有点头疼。

有人可以直接向我展示???

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您看起来有一个复制粘贴错误:...Map(b => b.Name)...应该放在BatchMapping,而不是BatchParameterMapping

public class BatchMapping : IAutoMappingOverride<Batch>
{
    public void Override(AutoMapping<Batch> mapping)
    {
        mapping.Map(b => b.Name).Unique();
    }
}

接下来,BatchParameter.Batch是从BatchParameterBatch的多对一关系,因此应与References(...)而不是Map(...)进行映射。您将References用于另一个实体的外键,并将Map用于简单属性。

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");
    }
}

最后,您应删除Id属性和Batch.BatchParameters的不必要映射。流畅的NHibernate的自动映射默认会根据需要映射它们。在Override方法中,您只需指定要执行与自动映射默认值不同的属性,例如指定唯一键。

答案 1 :(得分:0)

如果Id和Name是BatchParameter表中的主键,则需要复合ID。此外,如果您想从BatchParameter类中获取批量参考,则需要使用Reference。以下内容应该与您的需求接近:

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);
    }
}