填充导航属性



我是 EF 的新手,在我的代码 1st 模型中,这是我的 Locality 类:

public class Locality : ILocality
{
    public int ID { get; set; }
    [Required]
    [MaxLength(150)]
    [Display(Name = "Locality")]
    public string Description { get; set; }
}

这是我的学校类,我在上面有一个导航属性 Locality,它是 1-1 关系:

public class School : ISchool
{
    public int ID { get; set; }
    [Required]
    [MaxLength(150)]
    [Display(Name = "School")]
    public string Description { get; set; }
    [Required]
    [Display(Name = "Locality")]
    public int LocalityID { get; set; }
    public virtual ILocality Locality { get; set; }
}

现在在我的学校控制器中,我的解决方案如下所示:

    public ActionResult SchoolList()
    {
        var allschools = schools.GetAll();
        foreach (var school in allschools)
        {
            school.Locality = localities.GetById(school.LocalityID);
        }
        return View(allschools);
    }

我的问题是,当我需要访问导航属性 Locality 并且我总是必须使用上面的代码填写时,它们将为 null:

        foreach (var school in allschools)
        {
            school.Locality = localities.GetById(school.LocalityID);
        }

我读到如果有外键设置,导航属性应该自动填充?如果是这样,我该怎么做?

导致Locality属性的类型为 ILocality 而不是 Locality 。并且EF不考虑LocalityIDLocality属性作为导航,即FK,所以Locality实体不会自动加载,因为ILocality接口,即抽象,可以由很多类实现,每个类都有自己的属性(列),名称等,所以EF很困惑,不知道,该怎么办, 因此,它会忽略此属性。要修复它,只需将类型从接口替换为类:

public class School : ISchool
{
    //other stuff...
    //public virtual ILocality Locality { get; set; }
    public virtual Locality Locality { get; set; }
}

附言如果ISchool接口具有成员:ILocality Locality { get; set; }您可以执行以下操作:

public class School : ISchool
{                
    //other stuff...
    [ForeignKey("LocalityDB")]
    public int LocalityID { get; set; }
    [NotMapped]
    public ILocality Locality {
        get {
            return LocalityDB;
        }
        set {
            if (value is Locality)
                LocalityDB = (Locality)value;
        }
    }
    public virtual Locality LocalityDB { get; set; }
}

另外,请检查延迟加载是否已打开。

最新更新