簡體   English   中英

EF Core SQLite 如何使用外鍵播種數據

[英]EF Core SQLite How can I seed data with foreign keys

如何將種子數據添加到DbSet並將其與另一個DbSet記錄綁定? 使用我的解決方案, ForeignKey值已正確設置,但ObjectModel中的TypeModel始終為null 另外,在將ObjectTypeModel創建到ICollection之后,如何將對象添加到 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; }
    }

我來自DbContextOnModelCreating()


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

嘗試接收數據時的 output ,其中 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為 null 的原因。

您需要組裝ObjectModel

細節:

當您執行SaveChangesAsync時,只有 [ Name="Test", PreviewImage = "null", TagName = "Test", TypeId = objectTypeOne.TypeModelId ] 保存在數據庫中。

            context.Set<ObjectModel>().Add(new ObjectModel
            {
                new ObjectModel() { Name="Test", PreviewImage = "null", TagName = "Test", TypeId = objectTypeOne.TypeModelId, TypeModel = objectTypeOne }
            });
            context.SaveChangesAsync();

在返回ObjectModel之前使用ObjectModel.TypeModelId設置ObjectModel.TypeModel

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM