두 테이블 인 테이블과 소유자가 있습니다. 두 개의 ID 열이 있지만 하나는 다른 테이블에 대해 필요한 외래 키가 있습니다.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는 모든 항목을 트랜잭션에 저장하므로 두 항목 모두 저장되거나 none이됩니다. – Pawel
@Pawel SaveChanges()를 호출하지 않으면 데이터베이스에서 자동 생성 된 ID가 생성되지 않습니다. – midspace
내가 말하려고했던 것은 참조를 올바르게 설정했다는 것입니다. 외래 키를 설정할 필요가 없습니다. (값을 모를 수 있습니다.) 배치를 저장할 때 설정해야합니다. – Pawel