[英]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。 其他数据 - PlayerId
和points
- 保存得很好。
我试过添加这个_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.