Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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
Fluent nhibernate 如何使用Fluent NHibernate自动映射和整数鉴别器获得每个继承层次结构的表?_Fluent Nhibernate_Fluent Nhibernate Mapping - Fatal编程技术网

Fluent nhibernate 如何使用Fluent NHibernate自动映射和整数鉴别器获得每个继承层次结构的表?

Fluent nhibernate 如何使用Fluent NHibernate自动映射和整数鉴别器获得每个继承层次结构的表?,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,我试着到处寻找这方面的信息,但似乎没有人能完全涵盖这个问题。我将其简化为以下示例 这是我的数据库: create table ThingTypes ( Id int, Name varchar(50) not null constraint PK_ThingTypes primary key (Id) ) go insert into ThingTypes(Id, Name) Values(1, 'ThingTypeOne') insert into ThingTyp

我试着到处寻找这方面的信息,但似乎没有人能完全涵盖这个问题。我将其简化为以下示例

这是我的数据库:

create table ThingTypes
(
    Id int,
    Name varchar(50) not null

    constraint PK_ThingTypes primary key (Id)
)
go

insert into ThingTypes(Id, Name) Values(1, 'ThingTypeOne')
insert into ThingTypes(Id, Name) Values(2, 'ThingTypeTwo')

create table Things
(
    Id int identity,
    Name varchar(50) not null,
    ThingTypeId int not null

    constraint PK_Things primary key (Id),
    constraint FK_Things_ThingTypes foreign key (ThingTypeId) references ThingTypes(Id)
)
go
这是我的模型:

public abstract class Thing
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
public class ThingTypeOne : Thing { }
public class ThingTypeTwo : Thing { }
以下是我的映射:

public class ThingOverride : IAutoMappingOverride<Thing>
{
    public void Override(AutoMapping<Thing> mapping)
    {
        mapping.DiscriminateSubClassesOnColumn("ThingTypeId", 0);
    }
}

public class ThingTypeOneMap : SubclassMap<ThingTypeOne>
{
    public ThingTypeOneMap()
    {
        DiscriminatorValue(1);
    }
}

public class ThingTypeTwoMap : SubclassMap<ThingTypeTwo>
{
    public ThingTypeTwoMap()
    {
        DiscriminatorValue(2);
    }
}

它失败是因为它试图将“ThingTypeOne”插入到表中,而表显然不存在。我需要做什么才能让Fluent NHibernate真正关注我设置的DiscriminateSubClassesOnColumn属性?

不是为每个子类添加子类映射,而是添加一个约定

class DiscriminatorValueConvention : ISubclassConvention
{
    public void Apply(ISubclassInstance instance)
    {
        if (instance.Type == typeof(ThingTypeOne))
        {
            instance.DiscriminatorValue(1);
        }
        else if (instance.Type == typeof(ThingTypeTwo))
        {
            instance.DiscriminatorValue(2);
        }
    }
}

如果不使用自动映射,即从自动映射(将&&!typeof(Thing).IsAssignableFrom(type)添加到我的DefaultAutomappingConfiguration扩展的ShouldMap方法)中排除每个继承层次结构类的所有表,我就可以实现这一点但是我的基类有很多属性,我真的想使用AutoMapping…指定
AutoMap.AssemblyOf().IncludeBase()
,这不起作用,因为这样会出现异常“Duplicate class/entity mapping ThingTypeOne”。
var sessionFactory = SessionFactoryBuilder.GetFactory(@"Data Source=localhost;Initial Catalog=ThingDatabase;Trusted_Connection=True;");
using (var session = sessionFactory.OpenSession())
{
    session.BeginTransaction();
    session.SaveOrUpdate(new ThingTypeOne
        {
            Name = "New Thing Type One"
        });
    session.Transaction.Commit();
}
class DiscriminatorValueConvention : ISubclassConvention
{
    public void Apply(ISubclassInstance instance)
    {
        if (instance.Type == typeof(ThingTypeOne))
        {
            instance.DiscriminatorValue(1);
        }
        else if (instance.Type == typeof(ThingTypeTwo))
        {
            instance.DiscriminatorValue(2);
        }
    }
}