fluent-nhibernate - 在 Fluent NHibernate 中使用鉴别器

标签 fluent-nhibernate

我正在尝试创建一个鉴别器列。此列将包含许多可用状态之一。就像我的代码将显示的那样,每个状态都有一个名称和一个背景颜色。每个状态共享相同的基类。

这是我的代码:

public class Item
{
    public virtual int Id { get; set; }
    public virtual Status ItemStatus { get; set; }
}

public abstract class Status
{
    private readonly int _id;
    public static readonly Status Foo = new FooStatus(1);
    public static readonly Status Bar = new BarStatus(2);

    public Status()
    {

    }

    protected Status(int id)
    {
        _id = id;
    }

    public virtual int Id { get { return _id; } }
    public abstract string Name { get; }
    public abstract string BackgroundColor { get; }
}

public class FooStatus : Status
{
    public FooStatus()
    {

    }

    public FooStatus(int id)
        : base(id)
    {

    }

    public override string Name
    {
        get { return "Foo Status"; }
    }

    public override string BackgroundColor
    {
        get { return "White"; }
    }
}

public class BarStatus : Status
{
    public BarStatus()
    {

    }

    public BarStatus(int id)
        : base(id)
    {

    }

    public override string Name
    {
        get { return "Bar Status"; }
    }

    public override string BackgroundColor
    {
        get { return "Black"; }
    }
}

这是我的映射:
public class ItemMap : ClassMap<Item>
{
    public ItemMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();

        DiscriminateSubClassesOnColumn<int>("ItemStatus", 0).AlwaysSelectWithValue();
    }
}

本质上,我想要的是,如果我设置 ItemStatusStatus.Foo然后是 ItemStatus列的值为 1。我现在所拥有的不会引发任何异常,但它总是插入 ItemStatus0 .

这是我正在使用的插入代码:
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    var item = new Item
    {
        ItemStatus = Status.Foo
    };
    session.Save(item);
    transaction.Commit();

    var firstItem = session.Get<Item>(1);
    Console.WriteLine(firstItem.ItemStatus.Name);
}

在哪里可以使用 FNH 阅读有关此主题的信息?

在有人建议检查谷歌之前,我确实搜索了几件事,但找不到完整的例子。

最佳答案

您的 SubclassMap看起来像这样:

public class FooStatusMap : SubclassMap<FooStatus>
{
    public FooStatusMap()
    {
        DiscriminatorValue(1);
    }
}

这被称为“每类表的层次结构”,您说得对,看起来那里没有很多资源。

我相信如果你不打电话DiscriminatorValueSubclassMap , NHibernate 试图通过查看被映射的子类的名称并查看它是否与鉴别器列中的值匹配来进行鉴别。

关于fluent-nhibernate - 在 Fluent NHibernate 中使用鉴别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887168/

相关文章:

asp.net-mvc - IWindsorContainer 与 IUnityContainer 有什么区别?

nhibernate - 流畅的 Nhiberhate 和缺失的毫秒

postgresql - 我如何使用 ssl 身份验证从 FluentNhibernate 连接到 postgres

nhibernate - 流利的 NHibernate 外键/级联

nhibernate - 从多个程序集映射

NHibernate:引用需要内连接而不是左连接

nhibernate - Fluent NHibernate 乐观锁

asp.net-mvc - 当您的 View 模型没有与域模型一样多的字段时,您如何忽略/保留 MVC 中的值?

nhibernate - 字符串值的长度超过映射/参数中配置的长度

asp.net - 如何使用流畅的 nhibernate (schemaexport) 测试生成表?在 asp.net 上下文中