asp.net - 导航属性是否必须在 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 导航属性将为空。这似乎不是它应该做的方式。
解决方案
从您所说的来看,这看起来像主键 - 外键关系。在 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 来指定上述关系。
推荐阅读
- python - Pandas 根据多列/行条件添加不同的行
- java - Hibernate 无法创建到数据库服务器的连接
- android - 如何将使用过的图像存储到一个可绘制文件夹中以减少 android 应用程序中的内存
- apache-kafka - Kafka Streams 何时反序列化
- dart - 将模型对象列表保存到文件的最佳方法
- reactjs - 在 React 类组件中将道具分配给变量
- amazon-web-services - 在启用 MFA 时转移 AWS 根账户访问权限
- mongodb - Mongoose 查找返回空数组
- android - 应用程序关闭/未运行时使用的正确上下文是什么。-
- java - 如何从 Maven 项目中的自定义 jar 运行测试?