2015-06-24 9 views
6

Neden var olan bir schoolclassCode'a yeni bir öğrenci eklemeye çalıştığımda daha fazla ayrıntı yok - bir DbUpdateException alıyorum?TransactionScope TransactionScope Hakkında Entity Framework ile Birden Fazla Öğe Geri Döndür TimeoutException

Bu, çok fazla ilişki var.

var schoolclassCode = await context.SchoolclassCodes.SingleAsync(s => s.Id == pupil.SchoolclassCodeId); 
schoolclassCode.Pupils.Add(pupil); 
context.Entry(schoolclassCode).State = EntityState.Modified; 
int count = await context.SaveChangesAsync(); 

Önce öğrenciyi context.Pupils.add (pupil) içine yerleştirmem gerekir mi?

Ben

schoolclassCode.Pupils.Add(pupil); 

yaparak ben BİR seferde bir schoolclasscode ilişkin içerisine göz bebeğinin insert ve set yapabilirsiniz düşünce ve sonra değiştirildiği şekilde schoolclassCode ayarlayın.

Varolan bir ana/üst öğe ile bir çok ilişkide yapılan bir varlığı nasıl eklenir?

GÜNCELLEME

System.Data.Entity.Infrastructure.DbUpdateException was unhandled by user code 
    HResult=-2146233087 
    Message=An error occurred while updating the entries. See the inner exception for details. 
    Source=mscorlib 
    StackTrace: 
     bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
     bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
     bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
     bei TGB.Repository.PupilRepository.<AddPupil>d__8.MoveNext() in c:\Repository\TGB\TGB.Repository\PupilRepository.cs:Zeile 29. 
    --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
     bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
     bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
     bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
     bei Business.IntegrationTests.PupilRepositoryTests.CreatePupil() in c:\TGB\IntegrationTests\PupilRepositoryTests.cs:Zeile 31. 
    InnerException: System.Data.Entity.Core.UpdateException 
     HResult=-2146233087 
     Message=An error occurred while updating the entries. See the inner exception for details. 
     Source=EntityFramework 
     StackTrace: 
      bei System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.<UpdateAsync>d__0.MoveNext() 
     --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
      bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      bei System.Data.Entity.Core.Objects.ObjectContext.<ExecuteInTransactionAsync>d__3d`1.MoveNext() 
     --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
      bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      bei System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStoreAsync>d__39.MoveNext() 
     --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
      bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      bei System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<ExecuteAsyncImplementation>d__9`1.MoveNext() 
     --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
      bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      bei System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesInternalAsync>d__31.MoveNext() 
     InnerException: System.Data.SqlClient.SqlException 
      HResult=-2146232060 
      Message=Timeout abgelaufen. Das Zeitlimit wurde vor dem Beenden des Vorgangs überschritten oder der Server reagiert nicht. 
      Source=.Net SqlClient Data Provider 
      ErrorCode=-2146232060 
      Class=11 
      LineNumber=0 
      Number=-2 
      Procedure="" 
      Server=MyAccount\SQLEXPRESS 
      State=0 
      StackTrace: 
       bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
       bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
       bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
       bei System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult) 
       bei System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult) 
       bei System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 
       --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
       bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
       bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
       bei System.Data.Entity.Utilities.TaskExtensions.CultureAwaiter`1.GetResult() 
       bei System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.<ExecuteAsync>d__0.MoveNext() 
       --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- 
       bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
       bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
       bei System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.<UpdateAsync>d__0.MoveNext() 
      InnerException: System.ComponentModel.Win32Exception 
       HResult=-2147467259 
       Message=Der Wartevorgang wurde abgebrochen 
       ErrorCode=-2147467259 
       NativeErrorCode=258 
       InnerException: 

GÜNCELLEME Aslında 2

public class SchoolclassCode 
{ 
    public SchoolclassCode() 
    { 
     Pupils = new HashSet<Pupil>(); 
    } 

    public int Id { get; set; } 
    public ISet<Pupil> Pupils { get; set; } 

} 

public class Pupil 
{ 
    public Pupil() 
    { 
     SchoolclassCodes = new HashSet<SchoolclassCode>(); 
    } 

    public int Id { get; set; } 
    public ISet<SchoolclassCode> SchoolclassCodes { get; set; } 

    [NotMapped] 
    public int SchoolclassCodeId { get; set; } 
} 

birçok ilişki birçok kongre tarafından işe ancak gerektiğini hala SchoolclassCode ve Pupillada betweeen yapılandırma nedeniyle DbUpdateException için açıkça kurulum açıklayamadığım davranış. ve her test bundan sonra ben dışarı ve SONRA herşey yorumladı önce benim takın Gözbebeği yöntemiyle

UPDATE [dbo].[SchoolclassCode] 
SET [SchoolclassNumber] = @0, [SubjectName] = @1, [Color] = @2, [ClassIdentifier] = @3, [SchoolyearId] = @4 
WHERE ([Id] = @5) 

-- @0: '7' (Type = String, Size = 10) 

-- @1: 'Math' (Type = String, Size = 10) 

-- @2: '5' (Type = Int32) 

-- @3: 'a' (Type = String, Size = 2) 

-- @4: '1' (Type = Int32) 

-- @5: '1' (Type = Int32) 

-- Executing asynchronously at 24.06.2015 16:57:57 +02:00 

-- Completed in 8 ms with result: 1 

INSERT [dbo].[Pupil]([FirstName], [LastName], [Postal], [City], [Street]) 
VALUES (@0, @1, NULL, NULL, NULL) 
SELECT [Id] 
FROM [dbo].[Pupil] 
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() 


-- @0: 'Max' (Type = String, Size = 25) 

-- @1: 'Mustermann' (Type = String, Size = 25) 

-- Executing asynchronously at 24.06.2015 16:49:30 +02:00 

-- Completed in 2 ms with result: SqlDataReader 



INSERT [dbo].[SchoolclassCodePupil]([SchoolclassCodeId], [PupilId]) 
VALUES (@0, @1) 

-- @0: '1' (Type = Int32) 

-- @1: '1' (Type = Int32) 

-- Executing asynchronously at 24.06.2015 16:49:30 +02:00 

-- Completed in 2 ms with result: 1 



Committed transaction at 24.06.2015 16:49:30 +02:00 

Closed connection at 24.06.2015 16:49:30 +02:00 

The thread 0x60 has exited with code 259 (0x103). 
The thread 0x1178 has exited with code 259 (0x103). 
The thread 0xdc0 has exited with code 259 (0x103). 
A first chance exception of type 'System.NullReferenceException' occurred in Business.IntegrationTests.dll 

GERÇEK SORUN

içindeki SaveChanges oluyor

public class SchoolclassCodeConfiguration : EntityTypeConfiguration<SchoolclassCode> 
{ 
    public SchoolclassCodeConfiguration() 
    { 
     base.Property(p => p.SchoolclassNumber).IsRequired().HasMaxLength(10); 
     base.Property(p => p.SubjectName).IsRequired().HasMaxLength(10); 
     base.Property(p => p.ClassIdentifier).IsOptional().HasMaxLength(2); 
     base.HasMany(p => p.Pupils) 
     .WithMany(p => p.SchoolclassCodes) 
     .Map(x => 
     { 
      x.MapLeftKey("SchoolclassCodeId"); 
      x.MapRightKey("PupilId"); 
      x.ToTable("SchoolclassCodePupil"); 
     }); 
    } 
} 

LOG HATALAR TransactionScope vardır iyi çalıştı!

Bu kodu kullandığımda neden bu Özel Durum'u alıyorum - Diğer testler + TransactionScope iyi çalışıyor! - Ben bu bağlantıyı okunduktan sonra

public abstract class IntegrationTestsBase 
    { 
     protected TransactionScope TransactionScope; 

     [TestInitialize] 
     public void TestSetup() 
     { 
      TransactionScope = new TransactionScope(); 
     } 

     [TestCleanup] 
     public void TestCleanup() 
     { 
      TransactionScope.Dispose(); 
     } 
    } 
+0

A "DbUpdateException" genellikle, EF düzeyinde değil, veritabanı düzeyinde bir sorun oluştuğunu gösterir. Normalde, iç istisna daha ilginç detaylara sahip olacaktır. Tam istisna yığını izini gönderir misiniz? – sstan

+0

Çok iyi tanındı!Güncellenmiş sorumu görün. Gerçek hata hakkında fazla bir şey yok. Ancak hata kaynağı, EF değil sql veri sağlayıcısıdır. – Elisabeth

+0

Ayrıca, yine de yanlış bir şey varsa, hem katılımcı Varlıklar ile soru güncelledi ... – Elisabeth

cevap

4

: Get TransactionScope to work with async/await

Ben bu durumdayım biliyordu:

".NET Framework 4.5.1 yılında yeni kurucular bir dizi var TransactionScopeAsyncFlowOption parametresini alan TransactionScope. MSDN'ye göre, iş parçacığı devamları boyunca işlem akışını sağlar. "

TransactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); 

benim Entegrasyon Testi Mutlu TDD :-) şimdi YEŞİL çalıştırmak yapacak TransactionScope doğru parametre !!!