HOTELとOWNERの2つのテーブルがあります。両方にとIdentity列がありますが、一方にはもう一方のテーブルに必要な外部キーがあります。
両方のレコードを同時にトランザクションで追加する必要がありますが、プライマリテーブルで挿入が失敗した場合は、セカンダリテーブルのレコードを書き込んだトランザクションをロールバックする必要があります。
私が理解している限り、セカンダリテーブルから自動生成されたIDをフェッチするには.SaveChanges()が必要ですが、これもトランザクションをコミットしているようです。
これを行う他の方法はありますか?
public class HOTEL
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int64 HOTEL_ID { get; set; }
public string blah1 { get; set; }
public string blah2 { get; set; }
}
public class OWNER
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int64 OWNER_ID { get; set; }
public string blah3 { get; set; }
public string blah4 { get; set; }
public Int64 HOTEL_ID { get; set; }
[ForeignKey("HOTEL_ID")]
public virtual HOTEL HOTEL { get; set; }
}
..。
public class MyContext : DbContext
{
public MyContext() : base() { }
public MyContext(string connectionString) : base(connectionString) { }
public DbSet<HOTEL> HOTELs { get; set; }
public DbSet<OWNER> OWNERs { get; set; }
public ObjectContext ObjectContext
{
get
{
return (this as IObjectContextAdapter).ObjectContext;
}
}
}
..。
Int64 ret = 0;
// Suppress required for DB2.
using (var transaction = new TransactionScope(TransactionScopeOption.Suppress))
{
try
{
using (var context = new MyContext())
{
var secondaryEntity = new HOTEL();
context.HOTELs.Add(secondaryEntity);
// This appears to commit the changes in the trasaction.
context.SaveChanges();
primaryEntity.HOTEL_ID = secondaryEntity.HOTEL_ID;
context.OWNERs.Attach(primaryEntity);
context.Entry(primaryEntity).State = primaryEntity.OWNER_ID == 0 ? EntityState.Added : EntityState.Modified;
context.SaveChanges();
ret = primaryEntity.OWNER_ID;
}
}
catch (Exception ex)
{
// Deal with errors.
}
if (ret != 0)
{
transaction.Complete();
}
}
return ret;