首页 > 解决方案 > 导航属性是否必须在 EF Core 中显式设置?

问题描述

所以假设我有两个模型:

public class Simple
{
    public int SimpleId { get; set; }
    public int TestId { get; set; }
    public Test Test { get; set; }
}
public class Test
{
    public int TestId { get; set; }
    public string Name { get; set; }
}

我想像这样添加一个新的简单:

    public void AddSimple()
    {
        var simple = new Simple
        {
            SimpleId = 11,
            TestId = 1 //Assume that this exists in the DB with name = "Testtest"
        };
        _repo.Add(simple);
    }

当我像这样从数据库中获取它时:

    public async override Task<Simple> Get(int id)
    {
        var simple = _entries
                    .Include(n => n.Test)
                    .FirstOrDefault(n => n.SimpleId == id);
        return simple;
    }

EF Core 是否应该自动推断并从 Simple.TestId 获取 Simple.Test?因为现在我必须创建新的简单记录的方式是像这样显式设置 Simple.Test:

    public void AddSimple()
    {
        var simple = new Simple
        {
            SimpleId = 11,
            TestId = 1 //Assume that this exists in the DB with name = "Testtest",
            Test = _testRepo.GetById(1)
        };
        _repo.Add(simple);
    }

否则,Simple.Test 导航属性将为空。这似乎不是它应该做的方式。

标签: asp.netentity-framework

解决方案


从您所说的来看,这看起来像主键 - 外键关系。在 Simple class -> Test 属性中添加注解以指定 FK 关系,如下所示:


    public class Simple
    {
        public int SimpleId { get; set; }
        public int TestId { get; set; }

        [ForeignKey("TestId")]
        public virtual Test Test { get; set; }
    }
    public class Test
    {
        public int TestId { get; set; }
        public string Name { get; set; }
    }

这明确地告诉 EF 你有一个关系并帮助填写导航属性。

您还可以使用 fluent API 来指定上述关系。


推荐阅读