[英]How to create a Multi-Column Index or Unique Constraint with 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
是從BatchParameter
到Batch
的多對一關系,因此應該使用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.