簡體   English   中英

實體框架只保存我的一些字段

[英]Entity Framework only saving some of my fields

我正在嘗試編寫一個小的 web api ,這是我第一次使用實體框架。

我的問題是只有我的一些數據被保存。

我有這個 GET 方法,它只是應該將 model 保存到數據庫中:

[HttpGet]
public async Task<IActionResult> PopulateDB()
{
    var playerOneQuest = new StatusModel
    {
        PlayerId = "1",
        points= 250,
        completedSteps = new List<Status>()
        {
            new Status
            {
                Id = 11,
                Index = 1
            } 
        }
    };
    
    _context.Quest.Add(playerOneQuest);
    await _context.SaveChangesAsync();

    return Ok("Added data"); // Breakpoint here
}

當我在最后一行添加斷點時, _context看起來與所有數據都很好,但是一旦方法執行completedSteps ,完成步驟將是 null。 其他數據 - PlayerIdpoints - 保存得很好。

我試過添加這個_context.Entry(playerOneQuest).State = EntityState.Added; 在調用SaveChangesAsync()之前,但completedSteps在方法執行后仍以 null 結束。

_context定義為:

public class QuestContext : DbContext
{
    public QuestContext(DbContextOptions<QuestContext> options)
        : base(options){  }

    public virtual DbSet<StatusModel> Quest { get; set; } = null!;
}

使用的 2 個模型定義為:

public class StatusModel
{
    [Key]
    public string? PlayerId {get;set;}
    public long Points{get;set;}
    public List<Status> completedSteps {get;set;} = null!;
}

public class Status
{
    public long Id {get;set;}
    public int Index {get;set;}
}

為了更好地衡量,這就是將數據庫上下文添加到我的 web 應用程序的方式:

builder.Services.AddDbContext<QuestContext>(opt =>
opt.UseInMemoryDatabase("Quests"));

在模型中:

 public class StatusModel
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id {get;set;}
        public long Points{get;set;}
        public List<Status> completedSteps {get;set;} = new List<Status>();
    }
    
    public class Status
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id {get;set;}
        public int Index {get;set;}
        public long StatusModelId {get;set;}
        public StatusModel {get;set;}
    }

OnModelCreating的存儲上下文中:

modelBuilder.Entity<Status>().HasOne(c => c.StatusModel).WithMany(c => c.completedSteps)
                    .HasForeignKey(c => c.StatusModelId).OnDelete(DeleteBehavior.Cascade);

您必須設置對象之間的關系。 您可以使用流利的 API 在您的上下文中執行此操作,或者直接在模型中使用屬性。 同樣在您的上下文中,您需要兩個 DbSet,用於 status 和 statusModel。

沒有測試就寫了答案,但應該足夠接近。 這是關系的鏈接: EF中的關系

我錯過了您的 PlayerId - 我猜這是 Player 的 FK? 比你還必須建立這種關系。 如果您打算將其作為 PK,它可能不應該為空。

我認為你應該使用 [HttpPost],而不是 [HttpGet]

暫無
暫無

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

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