【问题标题】:Asp.Net MVC Reaching The Property Using Many To Many RelationAsp.Net MVC 使用多对多关系获取属性
【发布时间】:2013-12-08 18:17:44
【问题描述】:

在我的模型中,一个人 (HrPerson) 可以拥有多个头衔 (HrPersonTitle)。所以我创建了下面的模型来建立两个模型之间的多对多关系。

人力资源模型:

public class HrPerson
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<HrPersonTitle> HrPersonTitle { get; set; }
    }

HrPersonTitle 模型:

public class HrPersonTitle
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public  ICollection <HrPerson> HrPerson { get; set; }
    }

在我的 DbContext 类中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<HrPerson>()
            .HasMany(s => s.HrPersonTitle)
            .WithMany(c => c.HrPerson)
            .Map(t =>
                 {
                     t.MapLeftKey("HrPersonId")
                     .MapRightKey("HrPersonTitleId")
                     .ToTable("HrMapPersonTitle");
                 });
    }

当我更新数据库时,HrMapPersonTitle 已创建。我认为多对多关系是可以的(?)

我的问题在于控制器操作。我的目标是获取属于任何人的所有title's name。我实现了以下代码。

控制器:

public PartialViewResult _ViewHrPersonTitle(int? personId)
{
    var Titles = db.HrPersonTitle.Where(p => p.HrPerson.**(ID)???** = personId)

    return PartialView(Titles);
}

似乎我无法从 HrPersonTitle 模型访问 HrPerson-ID 属性。我认为这是应该的。 我想知道获取属于 Person 的所有 Title 的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc entity-framework ef-code-first many-to-many asp.net-mvc-5


    【解决方案1】:

    通常,您可以这样做:

    public PartialViewResult _ViewHrPersonTitle(int? personId)
    {
        var person = db.HrPerson.Find(personId);
        var titles = person.HrPersonTitle.ToList(); // .ToList() is optional
    
        return PartialView(titles);
    }
    

    此外,您无法直接从 Title 实体访问 HrPerson 的原因是您没有在实体类中声明它 virtual。 实体框架需要将导航属性设置为虚拟的,以便延迟加载它们/与动态代理一起使用。

    如果你不声明它们virtual,它们将不会默认被延迟加载。

    仍然可以急切地加载它们

    .Include(..)

    或懒惰地

    .Load()(显式加载)。

    但对于您的用例,最好还是采用自动方式。

    【讨论】:

    • 非常感谢..那么对于性能,哪一个更好? Leager 加载还是延迟加载?
    • 还有一件事,我无法使用 HrMapPersonTitle。例如,我想在控制器中创建一个新行,但我无法访问它。
    • 延迟加载仅在实际访问时加载属性。但是,如果您确切地知道自己需要什么,那么仅显式加载可能会更好。至于无法访问的映射表:创建关系时将创建一个条目。与db.HrPerson.Find(personId).add(new HrPersonTitle()); 一样,这将自动创建条目,并且它也可以反过来工作(添加到现有的 HrPersonTitle)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多