首页 > 解决方案 > EF Core SQLite 如何使用外键播种数据

问题描述

如何将种子数据添加到DbSet并与另一条DbSet记录绑定?使用我的解决方案,该ForeignKey值已设置正确,但TypeModelfrom the ObjectModelalways 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"}

标签: c#sqliteasp.net-coreasp.net-web-apientity-framework-core

解决方案


它不能自动填充,这就是为什么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);
         }

推荐阅读