如何在(fluent) NHibernate中使用字符串键

5

我正在处理使用字符串作为主键的既有数据库。 使用Fluent NHibernate,并配合Sqlite(内存提供程序用于单元测试)和SQL Server 2005

我有以下实体:

public class Entity
{
    public virtual DateTime TimeStamp { get; set; }

    public virtual string Name { get; set; }
}

使用此映射:

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Map(_ => _.TimeStamp);
        Id(_ => _.Name).CustomType("AnsiString");
    }
}

然而,它并没有起作用,报错信息为“NHibernate.TypeMismatchException : 提供的 id 类型错误。期望类型:System.Int32,实际类型:System.String”。
如何解决这个问题?另外,是否有关于 Fluent NHibernate 的好文档可供参考?
提前感谢。

谢谢提供的链接,虽然它们对我来说既不新鲜,也没有任何与我的问题相关的内容 :) 我在那里找不到关于字符串键的任何信息。此外,我想从显式映射开始。 - the_joric
这个链接https://dev59.com/2kbRa4cB1Zd3GeqPxiNO中讨论了这个问题。 - krystan honour
@krystanhonour 不完全是。而且那个问题没有被接受的答案。如果你能识别出答案,你能在这里重新发布并得到投票和我的感激之情吗?谢谢。 - the_joric
1个回答

12

如果您使用字符串作为主键,那么您可能需要像这样做:

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Id(x => x.Name).GeneratedBy.Assigned();
        Map(x => x.TimeStamp);
    }
}

来自nhibernate文档:

5.1.4.7. 指定标识符

如果你希望应用程序分配标识符(而不是让NHibernate生成它们),你可以使用指定的发生器。这个特殊的发生器将使用已经分配给对象标识属性的标识值。当使用此功能分配具有业务含义的键时要非常小心(几乎总是一个糟糕的设计决策)。

由于其固有的特性,使用此生成器的实体不能通过ISession的SaveOrUpdate()方法保存。相反,您必须显式指定NHibernate是否应该通过调用ISession的Save()或Update()方法来保存或更新对象。

此外,这里有一篇相关文章。虽然有点过时,但仍适用于您的情况:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接