如何在(流畅的)NHibernate中使用字符串键

the*_*ric 5 .net c# database nhibernate fluent-nhibernate

我正在使用使用字符串作为主键的brownfield数据库.使用Fluent NHibernateSqlite(内存提供程序进行单元测试)和SQL Server 2005.

我有以下实体:

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

    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有了这个映射:

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

然而它说不起作用 NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

如何使这项工作?另外,有没有关于流利的nhibernate可用的良好文档?

提前致谢.

Col*_*e W 12

如果您使用字符串作为主键,则可能需要执行以下操作:

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

从nhibernate文档:

5.1.4.7.分配的标识符

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

由于其固有特性,使用此生成器的实体无法通过ISession的SaveOrUpdate()方法保存.相反,如果要通过调用ISession的Save()或Update()方法来保存或更新对象,则必须明确指定NHibernate.

这里还有一篇相关文章.它有点过时但仍适用于您的情况:

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