2011-01-07 28 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... 

希望这有助于。