2014-08-29 111 views
1

我正在处理ASP.NET MVC 4 w/EF 4应用程序。从DBContext中排除列/属性

这是我的问题: 我有一个对象w/byte []属性(其中3个)来存储文件(varbinary(MAX))。然而,每当我查询对象,如果这些文件是“大”(> 1MB),我有超时问题。我可以增加上下文的超时时间,但我宁愿找到更好的解决方案。

我试图将[NotMapped]属性添加到属性中,因为它不包含在查询中,但是我无法更新数据库中的值。

public class Product 
{ 
    public int ProductID { get; set; } 

    [NotMapped] // <-- doesn't allow saving, but hides from the generated SQL 
    public byte[] File1 { get; set; } 
    public byte[] File2 { get; set; } 
    public byte[] File3 { get; set; } 

所以我的问题是: 如果可能的话,我怎么能叫

myContext.SaveChanges(); 

,并有实际保存更改,而原来的

var product = context.Products.Single(p => p.ProductID == productID); 

不选择varbinary字段?

+3

您需要将它们移动到另一个对象中。您可以创建class \ table ProductFiles并在此存储二进制数据,并从Product – 2014-08-29 21:29:28

+1

@SergeyLitvinov中引用它,您应该将其作为答案发布。 – Stilgar 2014-08-29 22:28:39

+1

看*表拆分*。 – 2014-08-29 23:18:13

回答

0

您可以通过在产品表上映射两个实体来实现此目的。

public class Product 
{ 
    [Key] 
    public int ProductID { get; set; } 
    // other properties ... 

    public virtual ProductBinaryData ProductBinaryData { get; set; } 
} 

public class ProductBinaryData 
{ 
    [Key] 
    public int ProductID { get; set; } 

    public byte[] File1 { get; set; } 
    public byte[] File2 { get; set; } 
    public byte[] File3 { get; set; } 
} 

然后在模型创建配置表映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Product>() 
       .HasRequired(e => e.ProductBinaryData) 
       .WithRequiredPrincipal(); 

    modelBuilder.Entity<Product>().ToTable("Products"); 
    modelBuilder.Entity<ProductBinaryData>().ToTable("Products"); 
} 

注意,两个实体映射到“产品”表。

+0

谢谢,这似乎是要走的路,我已经部分工作。唯一的问题是,用户一次提交1个文件,并且每次提交文件时,都会清除数据库中的其他2个文件。 – user1147941 2014-09-03 13:41:00

+0

我需要为每个文件创建一个实体/类,以便一次提交一个文件? – user1147941 2014-09-03 14:20:44

+0

在这种情况下,您可能希望将实体附加到上下文(假定您的实体未更改并存在于数据库中),然后可以更新File1字段而不更改其他属性。 – t3z 2014-09-03 21:15:13