我是一个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来说有点头疼。
有人可以直接向我展示???
谢谢!
答案 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
是从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
方法中,您只需指定要执行与自动映射默认值不同的属性,例如指定唯一键。
答案 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);
}
}