流畅的NHibernate没有自动化SQL异常,关键字' User'附近的语法不正确

时间:2012-05-01 13:26:22

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

刚开始在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”,其列与用户属性相匹配。任何帮助将不胜感激

4 个答案:

答案 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的进一步评论。