3

NHibernateと私の目からちょうど始まるすべてが正しいようですが、明らかにそうではありません。Fluent NHibernate、SQL例外の自動設定なし、キーワード 'User'の近くの構文が間違っている

namespace Users 
    { 
     public class User 
     { 
      public virtual string firstName { get; set; } 
      public virtual string lastName { get; set; } 
      public virtual int Id { get; set; } 
     } 
    } 

とユーザーマッピング(またして列名の周りの角括弧なしで走った:私は下に示したユニットテストをRENとき、私は、キーワード「ユーザー」 の近くに構文エラーがここに私のユーザークラスが存在していることをバック受け取ります同じ結果:

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

データアクセス層 - は、単に同上でユーザーを取得し

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です。どんな助けもありがとうございます。

答えて

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

また、あなたの代わりに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

+0

入力のおかげで結果は変わらなかったが –

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

どこに括弧が必要なのだろうか?はい、列名はプロパティ名と同じだ –

0

Reserved Keywordsを使用して、テーブルまたはカラムに名前を付けることは避けてください。 Hibernateは、MS SQLで受け入れられないSQL文を形成します。 NHibernate + Fluent + Automapperで同じ問題があり、 "user"カラムを "username"に名前を変更して解決しました。他のDBがそれをどのように処理しているか分かりません。

さらにhereについてのコメント

4

あなたの設定でこれを行うことができる必要があります:自動的にあなたのためのあなたのテーブル名とカラム名をエスケープする必要があり

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

関連する問題