2011-01-07 30 views
2

實體框架是拋出錯誤:實體框架 - 無法更新EntitySet的二進制數據

Test 'WorkerProcessService.Test.WorkerProcessMonitorTests.Test' failed: System.Data.UpdateException : Unable to update the EntitySet 'Processor' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. 
at System.Data.SqlClient.SqlGen.DmlSqlGenerator.ExpressionTranslator.Visit(DbScanExpression expression) 
at System.Data.Common.CommandTrees.DbScanExpression.Accept(DbExpressionVisitor visitor) 
at System.Data.SqlClient.SqlGen.DmlSqlGenerator.GenerateInsertSql(DbInsertCommandTree tree, SqlVersion sqlVersion, List`1& parameters) 
at System.Data.SqlClient.SqlGen.SqlGenerator.GenerateSql(DbCommandTree tree, SqlVersion sqlVersion, List`1& parameters, CommandType& commandType, HashSet`1& paramsToForceNonUnicode) 
at System.Data.SqlClient.SqlProviderServices.CreateCommand(DbProviderManifest providerManifest, DbCommandTree commandTree) 
at System.Data.SqlClient.SqlProviderServices.CreateCommand(DbCommandTree commandTree) 
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) 
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at System.Data.Objects.ObjectContext.SaveChanges() 
WorkerProcessMonitor.cs(79,0): at Star.Portal.Services.WorkerProcessMonitor.AddComponent(Byte[] component) 
WorkerProcessMonitorTests.cs(55,0): at WorkerProcessService.Test.WorkerProcessMonitorTests.Test() 

我已經產生了表格等,汽車EDMX模型

CREATE TABLE [dbo].[Processor](
    [ProcessorID] [int] IDENTITY(1,1) NOT NULL, 
    [ProcessorDLL] [varbinary](max) NULL, 
) 

如下因素無法更新

public void AddComponent(byte[] component) 
     { 
      Processor p = new Processor() 
           { 
            ProcessorDLL = component, 
           }; 
      using (var cn = GetWorkerProcessEntities()) 
      { 

       cn.AddToProcessors(p); 
       cn.SaveChanges(); 
      } 

     } 

的問題是:我必須做具體落實在SQL Server二進制存儲什麼?

+0

看看http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-ado-net/21686/EF-or-LINQtoSQL-and-VarBinary-Max – 2011-01-07 15:16:38

回答

1

簡單的答案...不,我將圖像存儲在具有相同數據類型(varbinary(max))的表中。

不太瞭解您的代碼,我使用本地數據庫進行簡單的測試。 這是我的POCO和DBcontext。 (我不使用自動生成的EDMX)

using System.Data.Entity.ModelConfiguration; 
public class Processor 
{ 
    public int ProcessorId { get; set; } 
    public byte[] ProcessorDLL { get; set; } 
} 
public class ProcessorConfiguration : EntityTypeConfiguration<Processor> 
{ 
    public ProcessorConfiguration() 
    { 
     HasKey(i => i.ProcessorId); 

     ToTable("Processor", "dbo"); 
    } 
} 
//DbContext 
public class myContext : DbContext 
{ 
    public DbSet<Processor> Processors { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new ProcessorConfiguration()); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

後來,當我添加一個新的處理器,我用這個

public void test() 
    { 
     myContext context = new myContext(); 

     Processor p = new Processor 
     { 
      ProcessorDLL = getSomeRandomByteArray() 
     }; 

     context.Processors.Add(p); 
     context.SaveChanges(); 
    } 

,並在我的表:

ProcessorID: 1 
ProcessorDLL: 0xFFD8FFE000104A46494600010200... 

希望這有助於。