Entity framework 实体框架核心:模型&x27;s相关实体正在保存,但已赢得';t载荷
我有一个模型Entity framework 实体框架核心:模型&x27;s相关实体正在保存,但已赢得';t载荷,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我有一个模型PlayerContext,它有一个类型为Inventory(它是ItemContainer的派生类型)的实体。这些都在我的DbContext中,称为ChunkContext。当我创建一个新的PlayerContextaInventory时,也会构建一个Inventory,两者都用正确的ID和所有内容保存在数据库中(我可以通过查看数据库来确认)。由于某种原因,当我稍后加载PlayerContext时(保存后),没有加载目录(它的默认值和ID为0,这是不正确的)。 下面是我如何加载播放
PlayerContext
,它有一个类型为Inventory
(它是ItemContainer
的派生类型)的实体。这些都在我的DbContext
中,称为ChunkContext
。当我创建一个新的PlayerContext
aInventory
时,也会构建一个Inventory
,两者都用正确的ID和所有内容保存在数据库中(我可以通过查看数据库来确认)。由于某种原因,当我稍后加载PlayerContext
时(保存后),没有加载目录(它的默认值和ID为0,这是不正确的)。
下面是我如何加载播放器(如果他们是新播放器,则将其添加到数据库中):
以下是所有模型类:
class ChunkContext : DbContext
{
...
public DbSet<PlayerContext> Players { get; set; }
...
public DbSet<ItemContainerContext> ItemContainers { get; set; }
public DbSet<Inventory> Inventories { get; set; }
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder.Entity<PlayerContext>().HasOne(p => p.inventory);
...
modelBuilder.Entity<ItemContainerContext>().HasKey(ic => ic.id);
...
base.OnModelCreating(modelBuilder);
}
_
_
尝试通过删除构造函数代码并添加外键来修复PlayerContext
public class PlayerContext
{
...
[Key]
public int id { get; set; }
...
public int inventoryId { get; set; }
[ForeignKey(nameof(inventoryId))]
[InverseProperty("playerContext")]
public Inventory inventory { get; set; }
...
}
public class Inventory : ItemContainerContext
{
[InverseProperty(nameof(PlayerContext.inventory))]
public virtual PlayerContext playerContext{ get; set; }
... ...
}
并修复代码
playerContext = new PlayerContext();
playerContext.inventory = new Inventory();
playerContext.username = username;
db.Players.Add(playerContext);
db.SaveChanges();
当您的playerContext
为空时,您只是在创建一个新的playerContext
并更改playerContext
等信息。似乎您没有填写足够的信息来包括库存
。在调试和检查库存时,最好放一些红点,它是空的还是有实体。删除库存=新库存()代码>来自PlayerContext
构造函数。您可以通过搜索查找解释为什么引用导航属性不应使用new
blank实例初始化的帖子。谢谢您解决了这个问题!InverseProperty属性的用途是什么?它允许创建正确的导航属性
public class Inventory : ItemContainerContext
{
... unrelated gameplay code ...
}
public class ItemContainerContext
{
[Key]
public int id { get; set; }
public ItemContainerContext()
{
...
}
...
}
public class PlayerContext
{
...
[Key]
public int id { get; set; }
...
public int inventoryId { get; set; }
[ForeignKey(nameof(inventoryId))]
[InverseProperty("playerContext")]
public Inventory inventory { get; set; }
...
}
public class Inventory : ItemContainerContext
{
[InverseProperty(nameof(PlayerContext.inventory))]
public virtual PlayerContext playerContext{ get; set; }
... ...
}
playerContext = new PlayerContext();
playerContext.inventory = new Inventory();
playerContext.username = username;
db.Players.Add(playerContext);
db.SaveChanges();