5

私は来週までに自分のコンピュータを蹴る前に...NHibernate.AssertionFailure:ヌル識別子

私はこれについて、すべての他の質問をチェックアウトしましたが、それらのどれも解決策を持っていません。このコードはすぐに取り除かれましたが、まだ動作していません。 NHibernate.AssertionFailure:ヌル識別子

これは私のマッピングファイルされる:オブジェクトを保存するとき

私はこのエラーを取得してい

public class Order 
{ 
    public virtual int Id { get; protected set; } 
} 

public class OrderMap : BaseMap<Order> 
{ 
    public SalesOrderMap() 
    { 
     Id(x => x.Id).Column("OrderId"); 
    } 
} 

これが実体でありますこれは私のテストコードです:

Order order = new Order(); 
ISession session = SessionFactory.GetCurrentSession(); 
session.SaveOrUpdate(order); <----EXCEPTION ON THIS LINE 
session.Flush(); 

そして強打...それは誰もが興味を持っていた場合、これはセッションファクトリを構築する方法です

[AssertionFailure: null identifier] 
    NHibernate.Engine.EntityKey..ctor(Object identifier, String rootEntityName, String entityName, IType identifierType, Boolean batchLoadable, ISessionFactoryImplementor factory, EntityMode entityMode) +135 
    NHibernate.Engine.EntityKey..ctor(Object id, IEntityPersister persister, EntityMode entityMode) +70 
    NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +545 
    NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +322 
    NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +130 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) +27 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) +63 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) +89 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) +188 
    NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) +259 
    NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj) +256 

を破る:

ControllerSource.SessionFactory = Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2008.ConnectionString(DataConfig.ConnectionString)) 
       .Mappings(x => x.FluentMappings.Add(typeof (OrderMap))) 
       .ExposeConfiguration(c =>{ 
              c.SetProperty("generate_statistics", "false"); 
              c.SetProperty("current_session_context_class", contextClass); 
              c.SetProperty("cache.use_second_level_cache", "false"); 
              c.SetProperty("cache.use_query_cache", "false"); 
              c.SetProperty("connection.release_mode", "on_close"); 
       }) 
       .BuildSessionFactory(); 
+0

注文テーブルの作成スクリプトを転記できますか? – twaggs

+0

現在のところ、フィールドは、自動インクリメント、int、ヌル入力可能ではありません – Paul

+0

(私はちょっとした枕だったと思いますが.......) – Paul

答えて

1

しようとしたときにあなたのentitity IDを割り当てるためにどちらかの必要があります新しいファイルを作成するか、マッピングファイルでファイルがどのように生成されるかを指定します。あなたのマッピングを変更します。

Id(x => x.Id).Column("OrderId").GeneratedBy.Identity(); 
+0

私は "Identity"がその値のデフォルトであると信じています...残念ながらそれはうまくいきませんでした。 – Paul

+0

@Paul - orderidプロパティのセットから 'protected'を削除しています – Justin

15

デフォルト・ジェネレータは、SQL Server 2008のターン使用アイデンティティに私の賭けは、あなたがテーブル定義の列で指定されたアイデンティティを持っていないことであるであろう、ネイティブです。

+3

正しい説明です。誰かがこれを答えとして受け入れるべきです。 – Tobias

2

テーブルにINSERTを妨げているトリガーがないこと、または挿入時にストアドプロシージャを呼び出す可能性があることを確認してください。

NHibernateがエンティティを挿入すると、新しいエンティティの自動生成された主キーをデータベースに問い合わせます。

INSERT INTO [Order] (MyProperty) VALUES (@p0); select SCOPE_IDENTITY() 

はSCOPE_IDENTITY()コールを選択します。

SCOPE_IDENTITYがNULLを返すと、NHibernate.AssertionFailure:null識別子例外が発生します。

例として、「INSTEAD OF INSERT」トリガは、SCOPE_IDENTITYがnullを返すようにし、NHibernateアサーションをトリガします。

トリガーが干渉している場合は、一時的に無効にすることで実際の問題であるかどうかをトラブルシューティングできます。長期的には、不要になったトリガーを完全に取り除くかどうかを決めることができます。

また、トランザクションで挿入をラップすることもできます。挿入の前にトリガを無効にし、エンティティの実際の保存/挿入を行い、次にトリガを再度有効にしてトランザクションをコミットします。

+1

あなたはオフィスにいないときでも役に立つことができますデビッド! – Dmihawk