簡體   English   中英

使用fluent-nhibernate自動化在外鍵上添加多列唯一約束

[英]Add multi-column unique constraint on foreign Key using fluent-nhibernate automapping

我是一個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有點令人頭疼。

有人能告訴我直路嗎?

謝謝!

首先,看起來你有一個復制粘貼錯誤: ...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方法中,您只需指定要執行與自動映射默認值不同的屬性,例如指定唯一鍵。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM