C# 在DBContext Find上填充关联实体

C# 在DBContext Find上填充关联实体,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个产品,需要有多个语言的一些领域。因此,我制作了一个ProductLanguage表,其中包含复合键和特定于语言的字段(ProductID、LanguageID、Name) 在我的产品课程中,我尝试了以下方法: [Table("Product")] public class Product { DBContext db = new DBContext(); public Product() { this.Multimedias = new List

我有一个产品,需要有多个语言的一些领域。因此,我制作了一个ProductLanguage表,其中包含复合键和特定于语言的字段(ProductID、LanguageID、Name)

在我的产品课程中,我尝试了以下方法:

[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; }
}

在控制器中,它将自动填充我的ProductLanguage属性?

您不需要该属性

[NotMapped]
public virtual ProductLanguage ProductLanguage { get; set; }
点击
ProductLanguages
集合时,将通过延迟加载填充该集合。您需要的是这样一个方法,它将按id返回ProductLanguage:

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

您可以在Get中为该属性移动ProductLanguage的赋值非常!!非常坏习惯。不要在实体(表)中创建上下文的实例

还有你为什么要这么做。。。我建议你仔细阅读懒惰和急切的加载

Product product = db.Products.Include("ProductLanguage").Find(id);
引述 “在控制器中,它将自动填充我的ProductLanguage属性?”

是的。。。。使用即时加载

Product product = db.Products.Include("ProductLanguage").Find(id);
但我强烈建议您不要在实体初始化时做所有其他奇怪的事情

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

如何设置ProductLanguages?如果它已经在收藏中,为什么你要为一个单独的属性?混合模型和DB访问可能会变得混乱。它已经在集合中,我希望有一个单独的属性,这样我就不会在我的代码中重复“product.ProductLanguages.Where(x=>x.LanguageID==y)”,可能会忘记它,并丢失特定于语言的文本。但是为什么要使用DB.ProductLanguages呢?你不能使用ProductLanguages集合吗?是的,我想是的,但这仍然对我没有帮助,因为代码中此时的ProductLanguages集合也是空的。所以习惯于看到空的get和set,我甚至没有想到这一点,哈哈,谢谢。请注意,通过使用getter设置
ProductLanguage
,可以,您将发出一个静默查询,以实际获取
ProductLanguages
集合中的相关语言。不要使用
Find(id)
,而应该使用
Include(“ProductLanguages”).SingleOrDefault(m=>m.id==id)
。然后,将立即查询所有内容。是的,或者在Get.Wow中添加一个is null检查。我甚至没有注意到OP代码中的那一点。是的,绝对不应该在实体内与上下文交互,绝对不应该在实体内创建上下文实例@Seabizkit:不能同时使用
包含
查找
。如果你想使用
Include
,你必须使用类似于
SingleOrDefault
FirstOrDefault
的东西。如果你看下面的评论,你会发现他不需要使用db。@AndyWises是的,你可能是对的,但你知道我的意思。;-)