C# - 流畅的NHibernate映射问题

时间:2010-12-17 16:50:37

标签: c# fluent-nhibernate

有没有办法避免Fluent NHibernate中的显式Id映射?

我希望它以某种方式自动生成条目ID,这样我就不必将它作为类的一部分引入。

public class HeyMapping
{
    public String Name { get; set; }
    public DateTime Timestamp { get; set; }
}

public class HeyMapping : ClassMap<HeyMapping>
{
    public HeyMapping()
    {
        Not.LazyLoad();

        // I'm not particularly sure how this line works, but
        // it fails the mapping unit test.
        CompositeId().KeyProperty(x => x.Name);

        Map(x => x.Name).Not.Nullable().Length(64);
        Map(x => x.Timestamp).Not.Nullable();
    }
}

2 个答案:

答案 0 :(得分:2)

如果您想在实体中使用 无ID ,则仍需要映射ID,以便NHibernate知道要使用的数据库列。

你可以打电话

Id<TColumnDataType>("column_name");

请注意,您将放弃一些NHibernate功能(特别是级联更新和调用SaveOrUpdate()的能力)并在数据库端产生性能损失,因为它具有仅限数据库的身份(我相信NHibernate将不得不进行额外的查询以进行比较)。

我通常会忽略这一点并允许Id作为我的域类中的一个持久性问题,所以我会这样做:

public class HeyMapping
{
    protected internal int Id { get; set; } // persistence concern

    public virtual String Name { get; set; }
    public virtual DateTime Timestamp { get; set; }
}

我意识到你可能不想这样做;我只是让你知道有一个权衡。

答案 1 :(得分:1)

创建一个基类,所有映射实体都从该基类继承,然后将Id属性添加到基类。