2012-07-11 40 views
6

Tôi đang sử dụng Khung thực thể với ODP.NET 11.2.0.3.0. Tôi đã kiên trì làm việc cho một số bảng, nhưng một trong những căn hộ này từ chối thêm một đối tượng mới đơn giản và tôi không thể tìm ra nó. Giúp đỡ của bạn được đánh giá rất cao. Cảm ơn bạnThao tác không hợp lệ do trạng thái hiện tại của đối tượng

Đây là mã. Tôi đã xóa trường hình ảnh khỏi đối tượng thông qua trình duyệt mô hình và mã vẫn thất bại khi SaveChanges() được gọi.

var corpDirectoryEntities = new CorpDirectoryEntities(); 
var cc = new EmployeePhoto(); 
cc.UserId = 12345; // NUMBER field 
cc.ImageName = "imagename"; // VARCHAR2(100) 
cc.Image = photoStream; // LONG RAW 
corpDirectoryEntities.EmployeePhotos.AddObject(cc); 
corpDirectoryEntities.SaveChanges(); 

Ngoại lệ sau xảy ra.

 
System.Data.UpdateException was unhandled by user code 
    Message=An error occurred while updating the entries. See the inner exception for details. 
    Source=System.Data.Entity 
    StackTrace: 
     at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
     at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 
     at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
     at System.Data.Objects.ObjectContext.SaveChanges() 
     at Repositories.Services.CorpDirectory.CorpDirectoryRepository.SaveDirectoryAccountPhoto(Int32 accountId, Byte[] photoStream) in C:\Dev\Projects\Repositories\Services\CorpDirectory\CorpDirectoryRepository.cs:line 356 
     at Tests.CorpDirectory.CorpDirectoryUserTestFixture.TestGetUserPhoto() in C:\Dev\Projects\Repositories.Tests\CorpDirectory\CorpDirectoryUserTestFixture.cs:line 192 
    InnerException: System.Data.EntityCommandCompilationException 
     Message=An error occurred while preparing the command definition. See the inner exception for details. 
     Source=System.Data.Entity 
     StackTrace: 
      at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree) 
      at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(UpdateTranslator translator, Dictionary`2 identifierValues) 
      at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) 
      at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
     InnerException: System.InvalidOperationException 
      Message=Operation is not valid due to the current state of the object. 
      Source=Oracle.DataAccess 
      StackTrace: 
       at Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.ExpressionTranslator.Visit(DbScanExpression expression) 
       at System.Data.Common.CommandTrees.DbScanExpression.Accept(DbExpressionVisitor visitor) 
       at Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.GenerateInsertSql(DbInsertCommandTree tree, EFOracleProviderManifest providerManifest, EFOracleVersion sqlVersion, List`1& parameters) 
       at Oracle.DataAccess.Client.SqlGen.SqlGenerator.GenerateSql(DbCommandTree tree, EFOracleProviderManifest providerManifest, EFOracleVersion sqlVersion, List`1& parameters, CommandType& commandType) 
       at Oracle.DataAccess.Client.EFOracleProviderServices.CreateCommand(EFOracleProviderManifest providerManifest, DbCommandTree commandTree) 
       at Oracle.DataAccess.Client.EFOracleProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) 
       at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) 
       at System.Data.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree) 
       at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree) 
      InnerException: 

Trả lời

16

Vì vậy, sau khi xem xét hàng giờ liền, cuối cùng tôi đã hiểu. Tôi đã kiểm tra tệp .ssdl. Một sự khác biệt giữa các đối tượng của tôi là cách thức <EntitySet ... > được xác định. Tôi đã thay đổi nó và, tất nhiên, nó hoạt động ngay bây giờ. Các nhà thiết kế EF chỉ là thần khủng khiếp.

<EntitySet Name="EmployeePhoto" ... store:Name="TABLE_NAME"> 
    <DefiningQuery> 
     SELECT ..... 
    </DefiningQuery> 
</EntitySet> 

tôi loại bỏ các <DefiningQuery...> và thay thế nó bằng những điều sau để phù hợp với các đơn vị khác:

<EntitySet Name="EmployeePhoto" ... /> 
+2

Thêm truy vấn xác định sẽ phá vỡ các thao tác đối tượng một cách bí ẩn bằng db của Oracle. – BigMomma

+2

Bất kỳ ý tưởng nào về lý do tại sao nhà thiết kế tạo ra một số bảng dưới dạng truy vấn? –

+0

Bởi vì Microsoft và Oracle không thể có được cùng. –

2

Nếu không có khóa chính trên một bảng oracle, Entity Khung sẽ làm cho nó sử dụng một truy vấn xác định khi nó được nhập vào lược đồ EF của bạn. Sau đó, vì nó là một truy vấn, không phải là một bảng, nó sẽ phát sinh một ngoại lệ hoạt động không hợp lệ khi bạn cố thêm một cái gì đó vào nó.

0

Tôi đã gặp lỗi này trong khi cố nâng cấp một dự án cũ hơn.

Đảm bảo dự án của bạn khớp với phiên bản khung .net được liệt kê trong tệp gói của bạn. Ví dụ. nếu bạn có net452 được liệt kê, hãy đảm bảo dự án của bạn được đặt để sử dụng mạng 4.5.2. Nếu bạn có nhiều hơn một dự án trong giải pháp của mình, hãy đảm bảo tất cả chúng được đặt thành đúng phiên bản .net framework.

Ngoài ra, tôi nhận thấy khi thêm mô hình dữ liệu mới vào dự án, nó sẽ bị nhầm lẫn với tệp mô hình cần thêm. Tôi tin rằng điều này là do TFS được cài đặt trên hộp dev của tôi (tôi đã thể hiện, sau đó cài đặt mới nhất). Để giải quyết vấn đề này, tôi đã ngắt kết nối dự án từ TFS bây giờ).

Các vấn đề liên quan