【问题标题】:EF Core SQLite How can I seed data with foreign keysEF Core SQLite 如何使用外键播种数据
【发布时间】:2020-10-20 02:54:10
【问题描述】:

如何将种子数据添加到DbSet 并将其与另一个DbSet 记录绑定? 使用我的解决方案,ForeignKey 值已正确设置,但来自ObjectModelTypeModel 始终为null。另外,在我创建 ObjectTypeModel 之后,如何将对象添加到 ICollection 中,还是会从 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# sqlite asp.net-core asp.net-web-api entity-framework-core


    【解决方案1】:

    无法自动填充,所以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之前将ObjectModel.TypeModel设置为ObjectModel.TypeModelId

            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);
             }
    

    【讨论】:

    • 感谢您的回答!是否可以向我展示如何做到这一点的示例?比如组装ObjectModel是什么意思?我不知道>.
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多