Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用Fluent Nhibernate表/子类策略时,能否指定标识列?_C#_Sql_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 在使用Fluent Nhibernate表/子类策略时,能否指定标识列?

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(

我正在创建一个Fluent N hibernate子类映射,当前看起来像这样:

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

您的层次结构是什么样的?你能发布父映射吗?编辑后的帖子有父映射。尝试了你的解决方案,效果很好。谢谢你的帮助。真的很老的问题,但仍然相关。为什么这只能作为约定配置,而不能作为每个映射方法配置?