2014-08-29 58 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