Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架核心:模型&x27;s相关实体正在保存,但已赢得';t载荷_Entity Framework_Entity Framework Core - Fatal编程技术网

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
a
Inventory
时,也会构建一个
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();