我有兩個表,HOTEL和OWNER。 都有和標識列,但其中一個具有所需的其他表的外鍵。EF 5.0不回滾計算出的標識值的交易
我需要在同一時間事務性地添加兩個記錄,但是如果在主表上插入失敗,我需要回滾爲輔助表寫入記錄的事務。
據我所知,我需要.SaveChanges()從輔助表中獲取自動生成的ID,但這也似乎是提交事務。
有沒有其他方式做到這一點?
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;
你爲什麼不添加的所有實體到上下文並保存更改? SaveChanges將所有事物保存在事務中,這樣既可以保存實體,也可以不保存。 – Pawel 2013-03-27 20:30:23
@Pawel如果未調用SaveChanges(),則不會創建數據庫自動生成的標識。 – midspace 2013-03-27 22:45:50
我想說的是,你正確設置引用,你不需要設置外鍵(反正你不會知道這些值) - 保存批次時,它們應該爲你設置..。 – Pawel 2013-03-27 22:52:52