刚开始在NHibernate和我的眼睛一切似乎都是正确的,但显然不是。当我进行下面显示的单元测试时,我收到关键字“User”附近有语法错误 这是我的用户类:
namespace Users
{
public class User
{
public virtual string firstName { get; set; }
public virtual string lastName { get; set; }
public virtual int Id { get; set; }
}
}
和用户映射(也在列名称周围没有方括号的情况下运行,结果相同:
namespace Users
{
class UserMap: ClassMap<User>
{
UserMap()
{
Table("User");
Id(x => x.Id).GeneratedBy.Native().Column("[Id]").Not.Nullable();
Map(x => x.firstName).Not.Nullable().Column("[firstName]");
Map(x => x.lastName).Not.Nullable().Column("[lastName]");
}
}
}
名为Framework.cs的Config文件
namespace Users
{
public class Framework
{
private const string ConnectionStr = "Data Source=ERALCH-ESTEPHEN;Initial
Catalog=NHDev;Integrated Security=True;Pooling=False";
public static ISessionFactory CreateFactory()
{
return Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration
.MsSql2008
.ConnectionString(ConnectionStr))
.Mappings(x=>x.FluentMappings.AddFromAssemblyOf<User>())
.BuildSessionFactory();
}
}
}
数据访问层 - 只需按Id
检索用户namespace Users
{
public class Accesslayer
{
public static IList<User> GetUserById(int Id)
{
ISessionFactory provider = Framework.CreateFactory();
using (ISession session = provider.OpenSession())
{
return session.CreateSQLQuery(String
.Format("SELECT * FROM User WHERE Id={0}", Id)).List<User>();
}
}
}
}
最后是单元测试层
namespace Users
{
[TestFixture]
class AccessLayerTest
{
[Test]
public void CanGetUserById()
{
Assert.AreEqual(1, Accesslayer.GetUserById(1).Count());
}
}
}
数据库是MSsql,其中一个表“User”,其列与用户属性相匹配。任何帮助将不胜感激
答案 0 :(得分:4)
您应该可以在配置中执行此操作:
var factory = Fluently.Configure()
// ...
.ExposeConfiguration(c => SchemaMetadataUpdater.QuoteTableAndColumns(c))
.BuildSessionFactory();
哪个应该自动转义您的表名和列名。
答案 1 :(得分:0)
您是否尝试在用户表名称周围添加反引号?
namespace Users
{
class UserMap: ClassMap<User>
{
UserMap()
{
Table("`User`");
Id(x => x.Id).GeneratedBy.Native().Column("`Id`").Not.Nullable();
Map(x => x.firstName).Not.Nullable().Column("`firstName`");
Map(x => x.lastName).Not.Nullable().Column("`lastName`");
}
}
}
有关详细信息,请参阅此答案:NHibernate - Force escaping on Table Names
此外,您应该使用NHibernate查询工具而不是SQL:
namespace Users
{
public class Accesslayer
{
public static IList<User> GetUserById(int Id)
{
ISessionFactory provider = Framework.CreateFactory();
using (ISession session = provider.OpenSession())
{
return session.Query<User>().Where(x => x.Id == Id ).List<User>();
}
}
}
}
查看本教程:http://www.d80.co.uk/post/2011/02/20/Linq-to-NHibernate-Tutorial.aspx
答案 2 :(得分:0)
映射时应该需要[Brackets]。哎呀,如果他们有相同的名字,这两个都会起作用:
public class UserMap: ClassMap<User>
{
UserMap()
{
Table("User");
Id(x => x.Id).GeneratedBy.Native().Not.Nullable();
Map(x => x.firstName).Not.Nullable();
Map(x => x.lastName).Not.Nullable();
}
}
public class UserMap: ClassMap<User>
{
UserMap()
{
Table("User");
Id(x => x.Id, "Id").GeneratedBy.Native().Not.Nullable();
Map(x => x.firstName, "firstName").Not.Nullable();
Map(x => x.lastName, "lastName").Not.Nullable();
}
}
答案 3 :(得分:0)
避免使用Reserved Keywords命名表或列。 Hibernate形成一个SQL语句,MS SQL不接受它。与NHibernate + Fluent + Automapper有同样的问题,并通过将“user” - 列重命名为“username”来解决它。不知道其他数据库如何处理它。
关于此here的进一步评论。