0

次のようにマップされたクラスがあります。

public class FooMap : ClassMap<Foo> 
{
  public FooMap()
  { 
    Table("Foo");
    LazyLoad();
    CompositeId().KeyProperty(x => x.ID, 
                              kp => kp.ColumnName("Id")
                                      .Type(typeof(long)))
                 .KeyProperty(x => x.ValidFrom);
   }
}

MSSQL 側では、Id は ID 列で、テーブルの PK は と で構成されIdますValidFrom

保存に使用するコードは次のとおりです。

ISession session = SessionService.GetSession();    
new SqlCommand("SET IDENTITY_INSERT Foo ON",
                session.Connection as SqlConnection)
                .ExecuteNonQuery();

try
{
    // performs various versioning checks,
    // then saves using transaction.
    // The session is the same as above
    GenericDataService.Save(myFoo);
}
finally
{
    new SqlCommand("SET IDENTITY_INSERT Foo OFF",
                    session.Connection as SqlConnection)
                    .ExecuteNonQuery();
}

に設定Identity_InsertしましたONが、次の例外が発生します( IDnew を保持して設定する場合ValidFrom):

Cannot insert explicit value for identity column in table 'Foo' when IDENTITY_INSERT is set to OFF.

これは実行された SQL です:

INSERT INTO Foo (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, Id, ValidFrom) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

なぜまだその例外が発生するのか、誰か説明できますか?

4

1 に答える 1

0

Nathan Fisherが提案したように問題が個別のトランザクションに関係している場合は、NHibernate のITransaction.Enlist(IDbCommand)方法で解決する必要があります。次のようなことを試してください:

using (var trx = session.BeginTransaction())
{
    ExecuteInNHTransaction(session, "SET IDENTITY_INSERT Foo ON");
    session.Save(myFoo);
    ExecuteInNHTransaction(session, "SET IDENTITY_INSERT Foo OFF");
    trx.Commit();
}
private static void ExecuteInNHTransaction(ISession session, string commandText)
{
    var command = new SqlCommand(commandText,
        (SqlConnection) session.Connection);
    session.Transaction.Enlist(command);
    command.ExecuteNonQuery();
}
于 2013-08-21T22:27:38.270 に答える