0

シャープアーキテクチャを使用して小さなアプリケーションを作成していますが、私は把握できないバグに遭遇しました。私はそれがNHibernteのマッピングと関係があると思います。私のHttpPost Create()メソッドでは、私のSaveOrUpdate呼び出しがテーブルの主キーフィールドにnullを挿入しようとしています。私のモデルの主キーの宣言はpublic virtual int Id { get; protected set; }です。SaveOrUpdateが主キーフィールドにNULLを挿入しようとしています

私はnewSprint.Idをチェックしましたが、それはゼロです。問題は私のHibernate Mappingであると思うので、以下のすべてを含めました。

ここで自動マッピングの設定です:

public class AutomappingConfiguration : DefaultAutomappingConfiguration 
    { 
     public override bool ShouldMap(System.Type type) 
     { 
      return type.GetInterfaces().Any(x => 
       x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>)); 
     } 

     public override bool ShouldMap(Member member) 
     { 
      return base.ShouldMap(member) && member.CanWrite; 
     } 

     public override bool AbstractClassIsLayerSupertype(System.Type type) 
     { 
      return type == typeof(EntityWithTypedId<>) || type == typeof(Entity); 
     } 

     public override bool IsId(Member member) 
     { 
      return member.Name == "Id"; 
     } 
    } 

自動永続化モデルジェネレータ:誰が提供できるすべての助けを事前に

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
    { 
     public AutoPersistenceModel Generate() 
     { 
      var mappings = AutoMap.AssemblyOf<Sprint>(new AutomappingConfiguration()); 
      mappings.IgnoreBase<Entity>(); 
      mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
      mappings.Conventions.Setup(GetConventions()); 
      mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 

      return mappings; 
     } 

     private static Action<IConventionFinder> GetConventions() 
     { 
      return c => 
        { 
         c.Add<PrimaryKeyConvention>(); 
         c.Add<CustomForeignKeyConvention>(); 
         c.Add<HasManyConvention>(); 
         c.Add<TableNameConvention>(); 
        }; 
     } 

おかげで。

編集 テーブル名のコンベンションに問題があることがわかりました。 AutoMapping設定からそれを削除すると、問題は解決しました。無関係なコードを削除し、TableNameConventionマッピングを追加して、誰かが特にその問題の原因を説明できるようにしたいと考えました。

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name)); 

    } 
} 
+0

id列にはどのようなsqlが生成されているかチェックしましたか? idのデフォルト名はどこに適用されますか? – cpoDesign

答えて

0

あなたのIdGeneratorはおそらく正しくありません。 PrimaryKeyに適切なジェネレータを設定する必要があります。たとえば、SQL Serverを使用している場合はID。

私はあなたの設定でこれをどのように設定するのかよく分かりませんが、Fluent NHに詳しくはありません。私の推測はPrimaryKeyConventionですか?

+0

奇妙なことに、これをもう少しデバッグしていて、HiLo、Identity、SequentialでIdジェネレータを指定しようとしました。いずれかを指定すると、エラーは消えましたが、データベースに何も追加されていません。 – Vish

+0

おそらくセッションをフラッシュしていませんか?またはトランザクションをコミットしない –

+0

もう少しデバッグを行い、問題が私のテーブル名のコンベンションにあると判断しました。問題を修正したものを削除するか、より正確にはそれをバイパスします。なぜそれが起こったのかを理解するためには、より多くの規則を調べなければならないでしょう。 – Vish

関連する問題