Исключить столбец / свойство из DBContext

1

Я работаю над приложением ASP.NET MVC 4 w/EF 4.

Вот моя проблема: у меня есть объект w/byte [] properties (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?

  • 3
    вам нужно переместить их в другой объект. Вы можете создать класс \ table ProductFiles и хранить здесь двоичные данные и ссылаться на них из Product
  • 1
    @SergeyLitvinov Вы должны опубликовать это как ответ.
Показать ещё 3 комментария
Теги:
database
entity-framework
asp.net-mvc

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

Обратите внимание, что оба объекта сопоставляются с таблицей "Продукты".

  • 0
    Спасибо, похоже, так и есть, и у меня это частично работает. Единственная проблема заключается в том, что пользователи отправляют по 1 файлу за раз, и каждый раз, когда они отправляют файл, он очищает остальные 2 в базе данных.
  • 0
    Должен ли я создать сущность / класс для каждого файла, чтобы разрешить 1 при отправке?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню