2015-10-29 3 views
1

У меня есть Продукт, который должен иметь несколько полей на нескольких языках. Поэтому я создал таблицу ProductLanguage, в которой есть сводные ключевые и языковые поля (ProductID, LanguageID, Name).Заполнение связанных объектов в DBContext Find

В моем классе продуктов я пытался что-то вроде этого:

[Table("Product")] 
public class Product 
{ 
    DBContext db = new DBContext(); 

    public Product() 
    { 
     this.Multimedias = new List<Multimedia>(); 
     this.ProductLanguages = new List<ProductLanguages>(); 
     this.ProductLanguage = db.ProductLanguages.Find(this.ID, Global.Language) ?? new ProductLanguage(); 
    } 

    public int ID { get; set; } 
    public string Code { get; set; } 
    public virtual ICollection<Multimedia> Multimedias { get; set; } 
    public virtual ICollection<ProductLanguage> ProductLanguages { get; set; } 

    [NotMapped] 
    public virtual ProductLanguage ProductLanguage { get; set; } 
} 

Так что я мог сразу получить доступ к языку определенных полей без необходимости проходить через коллекцию - проблема является объектом, очевидно, не имеет идентификатора все же.

Есть ли способ, так что, когда я

Product product = db.Products.Find(id); 

в контроллер будет автоматически заполнять мою собственность ProductLanguage?

+0

Как вы устанавливаете товар? Если это уже в коллекции, почему у вас есть отдельное свойство для одного? Смешивание модели и доступ к БД могут стать беспорядочными. –

+0

Уже в коллекции я хотел бы иметь отдельное свойство, поэтому я не дублирую «product.ProductLanguages.Where (x => x.LanguageID == y)» по всему моему коду и, возможно, забыл его где-то и потерял язык конкретный текст. –

+0

Но почему вы используете db.ProductLanguages? Не могли бы вы использовать коллекцию ProductLanguages? –

ответ

1

Вы можете переместить назначение ProductLanguage в Get для этого свойства.

+0

Так привыкли видеть пустоты и комплекты, я даже не думал о том, что ха-ха, спасибо. –

+0

Учтите, что, установив 'ProductLanguage' с помощью getter, вы будете выдавать тихий запрос, чтобы фактически получить эти родственные языки в коллекции' ProductLanguages'. Вместо использования 'Find (id)', вы должны использовать 'Include (« ProductLanguages ​​»). SingleOrDefault (m => m.Id == id)'. Затем все будет запрошено сразу. –

+0

Да или добавьте нулевую проверку в Get. –

0

Вам не нужно свойство

[NotMapped] 
public virtual ProductLanguage ProductLanguage { get; set; } 

ProductLanguages коллекция будет заполняться с помощью отложенной загрузки, когда вы нажмете ее. Что вам нужно, это способ, как это, что будет возвращать ProductLanguage по идентификатору:

public ProductLanguage GetProductLanguageById(int id) 
{ 
    if (ProductLanguages != null) 
    { 
     return ProductLanguages.Where(pl => pl.Id == id).FirstOrDefault(); 
    } 
} 
0

Это не подтверждает какую-либо практику/использование, которое я видел раньше .., независимо от того, я бы счел это очень !! очень!! плохая практика. Не делайте экземпляр вашего контекста внутри Entity (таблицы).

Также почему вы это делаете ... Я предлагаю вам читать на ленивой и нетерпеливой загрузке.

Цитировать "в контроллере он автоматически заполнит мое свойство ProductLanguage?"

Да .... использовать нетерпеливый груз.

Product product = db.Products.Include("ProductLanguage").Find(id); 

Но я бы очень хотел, чтобы вы не делали все эти другие странные вещи в инициализации своего объекта.

DBContext db = new DBContext(); 
Product product = db.Products.Include("ProductLanguage").Find(id); 
+0

Ничего себе. Я даже не заметил этого бита в коде OP.Да, определенно, вы никогда не должны взаимодействовать с вашим контекстом внутри объекта, и, безусловно, вы никогда не должны создавать экземпляр вашего контекста внутри объекта. @Seabizkit: вы не можете использовать 'Include' и' Find' вместе. Если вы хотите использовать 'Include', вы должны использовать что-то вроде« SingleOrDefault »или« FirstOrDefault ». –

+0

Если вы посмотрите комментарии к вопросу, вы увидите, что ему не нужно использовать db. –

+0

@ AndyWiesendanger yeah созревает, вероятно, правильно, но вы знали, что я имел в виду. ;-) – Seabizkit