シャープアーキテクチャを使用して小さなアプリケーションを作成していますが、私は把握できないバグに遭遇しました。私はそれが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));
}
}
id列にはどのようなsqlが生成されているかチェックしましたか? idのデフォルト名はどこに適用されますか? – cpoDesign