3

刚从 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 的配置文件

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,其中包含一个表“用户”,其列与用户属性匹配。任何帮助将不胜感激谢谢

4

4 回答 4

4

You should be able to do this in your configuration:

var factory = Fluently.Configure()
    // ...
    .ExposeConfiguration(c => SchemaMetadataUpdater.QuoteTableAndColumns(c))
    .BuildSessionFactory();

Which should escape your table and column names for you automagically.

于 2015-02-03T14:46:31.423 回答
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();
    }
}
于 2012-05-06T15:03:47.970 回答
0

避免使用保留关键字命名您的表或列。Hibernate 形成了一个不会被 MS SQL 接受的 SQL 语句。与 NHibernate + Fluent + Automapper 有同样的问题,并通过将“用户”列重命名为“用户名”来解决它。不知道其他数据库如何处理它。

更多关于这里的评论。

于 2013-04-11T14:31:10.593 回答
0

您是否尝试在 User 表名周围加上反引号?

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

于 2012-05-01T13:53:09.597 回答