C# 在使用Fluent Nhibernate表/子类策略时,能否指定标识列?
我正在创建一个Fluent N hibernate子类映射,当前看起来像这样:C# 在使用Fluent Nhibernate表/子类策略时,能否指定标识列?,c#,sql,nhibernate,fluent-nhibernate,C#,Sql,Nhibernate,Fluent Nhibernate,我正在创建一个Fluent N hibernate子类映射,当前看起来像这样: public class TaskDownloadMap: SubclassMap<TaskDownload> { public TaskDownloadMap() { Table("TasksDownload"); Map(x => x.ExtraProperty1, "ExtraProperty1") .Nullable(
public class TaskDownloadMap: SubclassMap<TaskDownload>
{
public TaskDownloadMap()
{
Table("TasksDownload");
Map(x => x.ExtraProperty1, "ExtraProperty1")
.Nullable();
Map(x => x.ExtraProperty2, "ExtraProperty2")
.Nullable();
}
}
public class TaskMap: ClassMap<Task>
{
public TaskMap()
{
Table("Tasks");
Id(x => x.Id, "Id")
.GeneratedBy.Identity();
.
.
.
}
}
这是因为我在子类的表上设置的Id列名为“TaskId”。是否有一些方法可以覆盖nhibernate尝试使用的默认命名方案?我似乎没有能力在子类中指定“Id”列,甚至找不到其他人谈论它
父映射如下所示:
public class TaskDownloadMap: SubclassMap<TaskDownload>
{
public TaskDownloadMap()
{
Table("TasksDownload");
Map(x => x.ExtraProperty1, "ExtraProperty1")
.Nullable();
Map(x => x.ExtraProperty2, "ExtraProperty2")
.Nullable();
}
}
public class TaskMap: ClassMap<Task>
{
public TaskMap()
{
Table("Tasks");
Id(x => x.Id, "Id")
.GeneratedBy.Identity();
.
.
.
}
}
公共类任务映射:类映射
{
公共任务图()
{
表(“任务”);
Id(x=>x.Id,“Id”)
.GeneratedBy.Identity();
.
.
.
}
}
就像我之前说的,我将使用每个子类的表策略,所以这是两个不同的表。我可以将TasksDownload表上的键更改为“Task_id”,但我更希望能够在映射中指定它是“Task id”,这样我就可以遵守命名约定。您不能用fluent API配置子类id,因为它是由内置映射对流处理的。但是您可以编写一个定制(如果需要,还可以添加一些额外的内容)。
样品溶液:
public class JoinedSubclassIdConvention : IJoinedSubclassConvention,
IJoinedSubclassConventionAcceptance
{
public void Apply(IJoinedSubclassInstance instance)
{
instance.Key.Column(instance.EntityType.BaseType.Name + "Id");
}
public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria)
{
criteria.Expect(x => x.EntityType == typeof(TaskDownload));
}
}
公共类联合子类约定:ijoined子类约定,
I加入子条款通风验收
{
public void Apply(IJoinedSubclassInstance实例)
{
instance.Key.Column(instance.EntityType.BaseType.Name+“Id”);
}
公共无效接受(IAcceptanceCriteria标准)
{
Expect(x=>x.EntityType==typeof(TaskDownload));
}
}
然后将对流添加到配置中:
Fluently.Configure()
//...
.Mappings(m =>
{
m.FluentMappings
//...
.Conventions.Add<JoinedSubclassIdConvention>();
});
流利。配置()
//...
.Mappings(m=>
{
m、 FluentMappings
//...
.Conventions.Add();
});
您的层次结构是什么样的?你能发布父映射吗?编辑后的帖子有父映射。尝试了你的解决方案,效果很好。谢谢你的帮助。真的很老的问题,但仍然相关。为什么这只能作为约定配置,而不能作为每个映射方法配置?