2014-08-29 4 views
1

Я работаю над приложением ASP.NET MVC 4 w/EF 4.Исключить столбец/свойство из DBContext

вот моя проблема: У меня есть объект w/byte [] свойства (3 из них) для хранения файлов (varbinary (MAX)). Однако всякий раз, когда я запрашиваю объект, если эти файлы «большие» (> 1 МБ), у меня есть проблемы с таймаутом. Я могу увеличить время ожидания контекста, но лучше найти лучшее решение.

Я попытался добавить атрибут [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 fields?

+3

вам нужно переместить их в другой объект. Вы можете создать класс \ table ProductFiles и сохранить здесь двоичные данные и ссылаться на него из Product –

+1

@SergeyLitvinov, вы должны опубликовать это как ответ. – Stilgar

+1

Посмотрите * Расщепление таблиц *. –

ответ

0

Вы можете достичь этого путем сопоставления двух объектов в таблице Product.

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"); 
} 

Обратите внимание, что оба объекта отображаются на "Products" таблицы.

+0

Спасибо, это, кажется, путь, и я частично работаю. Единственная проблема заключается в том, что пользователи одновременно отправляют 1 файл, и в любой момент, когда они отправляют файл, он очищает остальные 2 в базе данных. – user1147941

+0

Должен ли я создать сущность/класс для каждого файла, чтобы разрешить 1 при подаче? – user1147941

+0

В этом случае вы можете привязать свою сущность к контексту (предполагается, что ваша сущность не изменяется и существует в БД), а затем вы можете обновить поле File1 без изменения других свойств. – t3z

Смежные вопросы