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());
        }
    }
}

データベースは、ユーザー プロパティに一致する列を持つ 1 つのテーブル "User" を持つ MSsql です。どんな助けでも感謝します

4

4 に答える 4

0

マッピング中は[ブラケット]が必要です。同じ名前の場合、どちらも同じように機能します。

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 で同じ問題が発生し、「user」列の名前を「username」に変更して解決しました。他のDBがそれをどのように処理するかわかりません。

これに関するその他のコメントはこちら.

于 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 - テーブル名のエスケープを強制する

また、SQL の代わりに NHibernate クエリ機能を使用する必要があります。

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 に答える