c# - EF Core SQLite 如何使用外键播种数据
问题描述
如何将种子数据添加到DbSet
并与另一条DbSet
记录绑定?使用我的解决方案,该ForeignKey
值已设置正确,但TypeModel
from the ObjectModel
always null
。另外,如何ICollection
在创建对象后将对象添加到对象中ObjectTypeModel
,还是会从 EF Core 自动填充?
我的模型:
public class ObjectModel : BaseEntity
{
[Key]
public int Id { get; set;
public String Name { get; set; }
public String PreviewImage { get; set; }
public String TagName { get; set; }
// Foreign keys---
public int TypeId { get; set; }
public ObjectTypeModel TypeModel { get; set; }
//---
}
public class ObjectTypeModel : BaseEntity
{
[Key]
public int TypeModelId { get; set; }
public String Name { get; set; }
public String PreviewImage { get; set; }
public String TagName { get; set; }
public ICollection<ObjectModel> Objects { get; set; }
}
我OnModelCreating()
来自DbContext
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ObjectModel>()
.HasOne<ObjectTypeModel>(d => d.TypeModel)
.WithMany(dm => dm.Objects)
.HasForeignKey(dkey => dkey.TypeId);
}
我的播种数据方法:
context.Set<ObjectTypeModel>().AddRange(new ObjectTypeModel[]
{
new ObjectTypeModel()
{
TypeModelId = 1,
Name = "TestType",
PreviewImage = null,
TagName = "TestType"
}
});
context.SaveChangesAsync();
var objectTypeOne = context.ObjectTypes.SingleOrDefault(a => a.TypeModelId.Equals(1));
context.Set<ObjectModel>().Add(new ObjectModel
{
new ObjectModel() { Name="Test", PreviewImage = "null", TagName = "Test", TypeId = objectTypeOne.TypeModelId, TypeModel = objectTypeOne }
});
context.SaveChangesAsync();
尝试接收数据时的输出,其中 TypeModel 始终为null
。
{"id":1,"name":"Test","previewImage":"null","tagName":"Test","typeId":1,"typeModel":null,"createdOn":"2020- 06-29T23:01:24.744472","modifiedOn":"2020-06-29T23:01:24.744464"}
解决方案
它不能自动填充,这就是为什么typeModel
接收数据时为空。
你需要组装ObjectModel
。
细节:
当你这样做时SaveChangesAsync
,只有 [ Name="Test", PreviewImage = "null", TagName = "Test", TypeId = objectTypeOne.TypeModelId
] 保存在 DB 中。
context.Set<ObjectModel>().Add(new ObjectModel
{
new ObjectModel() { Name="Test", PreviewImage = "null", TagName = "Test", TypeId = objectTypeOne.TypeModelId, TypeModel = objectTypeOne }
});
context.SaveChangesAsync();
ObjectModel.TypeModel
返回ObjectModel.TypeModelId
前设置ObjectModel
。
public IActionResult GetObjectModel(int? id)
{
if (id == null)
{
return NotFound();
}
var objectModel= await _context.ObjectModel.FindAsync(id);
if (objectModel== null)
{
return NotFound();
}
var typeModel= await _context.TypeModel.FindAsync(objectModel.TypeModelId);
if (typeModel!= null)
objectModel.TypeModel = typeModel;
return View(objectModel);
}
推荐阅读
- java - ExecutorService - 关闭主线程
- ruby-on-rails - 多对多关联通过另一个关联
- javascript - 如何在gridComplete之后过滤数据 - 客户端(jqGrid)
- c++ - 是否可以将纯虚函数覆盖到模板?
- node.js - 在本地存储文件的位置,以便在删除 Electron 应用程序后不会被删除?
- mongodb - 从 mongodb 中的第三级嵌套数组文档中查找计数
- c++ - 关于封装的 C++ 迭代节点
- api - 贝宝获得客户批准流程不明确
- angularjs - 无法将模态数据输入 angularjs 控制器
- javascript - 应用程序脚本 new Date 和 getTime 在浏览器中的行为不一样