C# 实体框架代码第一次错误保存

C# 实体框架代码第一次错误保存,c#,entity-framework,ef-code-first,local-database,C#,Entity Framework,Ef Code First,Local Database,我在理解EF如何保存我的实体时遇到问题。 我有我的DbContext: public DbSet<Hero> MyHeroes { get; set; } public DbSet<SpecialItem> SpecialItems { get; set; } public DbSet<Weapon> MyWeapons { get; set; } public DbSet<WeaponHolder> MyWeapo

我在理解EF如何保存我的实体时遇到问题。 我有我的
DbContext

    public DbSet<Hero> MyHeroes { get; set; }
    public DbSet<SpecialItem> SpecialItems { get; set; }
    public DbSet<Weapon> MyWeapons { get; set; }
    public DbSet<WeaponHolder> MyWeaponHolders { get; set; }
它包含一个
武器持有者

public class Character
    {
        [Key]
        public int CharacterID { get; set; }
        [Column("name")]
        protected string name;
        [Column("maxLife")]
        protected int maxHitPoint;
        [Column("actualLife")]
        protected int actualHitPoint;
        [Column("baseAgility")]
        protected int baseAgility;
    }
public class Hero : Character
    {
        [Column("Gold")]
        private int gold;
        public WeaponHolder weaponHolder;
        public List<SpecialItem> specialItems;
    }
public class WeaponHolder
    {
        [Key]
        public int WeaponHolderID { get; set; }
        [Column("weaponHolderSize")]
        private int weaponHolderSize;
        List<Weapon> weapons;
    }
我正在创造一个
英雄
并给他几件
特殊装备
,还有一个
武器持有者
和几件
武器
。当我试图保存我的
英雄时,使用

heroContext.MyHeroes.Add(hero);
它确实保存了它的
特殊文件
,但不保存它的
武器持有者
和内容。如果我使用“手动”保存我的
武器持有者

然后按预期保存
武器持有者
及其
武器

我注意到EF没有在
Hero
WeaponHolder
之间创建外键,但我手动添加了一个,并且没有注意到保存组件中的任何更改


当我保存我的
英雄时,为什么EF不自动保存我的
英雄的
武器持有者
?我可以手动保存吗?如果是这样,我如何在保存我的
Hero
主键后立即检索他,以便手动将我的
WeaponHolder
外键链接到正确的值?

对于Hero中的单个实体(如WeaponHolder属性),它还将包含对ID的引用,如

public int WeaponHolderID { get; set; }

这个实现中缺少了这一点。您所指的关系设置是否正确?

如果在Hero中有一个实体(如武器持有者属性),它也会在其中引用ID,如

public int WeaponHolderID { get; set; }

这个实现中缺少了这一点。您所指的关系设置正确吗?

多亏了Brian Mains的帮助,我才得以正常工作。
为了能够正确检索我的属性,我缺少了很多getter/setter。
事实上,我必须为每个键添加一个新的ID字段,并将我的
[ForeignKey(“…”)
放在上面

我的代码现在如下所示:

public class Character
    {
        [Key]
        public int CharacterID { get; set; }
        [Column("name")]
        public string name { get; set; }
        [Column("maxLife")]
        protected int maxHitPoint{ get; set; }
        [Column("actualLife")]
        protected int actualHitPoint{ get; set; }
        [Column("baseAgility")]
        protected int baseAgility{ get; set; }
    }

public class Hero : Character
    {
        [ForeignKey("weaponHolder")]
        public int WeaponHolderID { get; set; }
        [ForeignKey("backPack")]
        public int BackPackID { get; set; }
        [Column("Gold")]
        private int gold{ get; set; }
        public WeaponHolder weaponHolder{ get; set; }
        public List<SpecialItem> specialItems{ get; set; }
    }
公共类字符
{
[关键]
公共int字符{get;set;}
[列(“名称”)]
公共字符串名称{get;set;}
[专栏(“maxLife”)]
受保护的int-maxHitPoint{get;set;}
[列(“实际寿命”)]
受保护的int-actualHitPoint{get;set;}
[栏目(“BaseActivity”)]
受保护的int-baseAgility{get;set;}
}
公众阶级英雄:性格
{
[外国钥匙(“武器持有者”)]
公共int武器持有者ID{get;set;}
[外国钥匙(“背包”)]
公共ID{get;set;}
[栏目(“黄金”)]
private int gold{get;set;}
公共武器持有者武器持有者{get;set;}
公共列表特殊文件{get;set;}
}

多亏了布莱恩·梅森的帮助,我才使它开始工作。
为了能够正确检索我的属性,我缺少了很多getter/setter。
事实上,我必须为每个键添加一个新的ID字段,并将我的
[ForeignKey(“…”)
放在上面

我的代码现在如下所示:

public class Character
    {
        [Key]
        public int CharacterID { get; set; }
        [Column("name")]
        public string name { get; set; }
        [Column("maxLife")]
        protected int maxHitPoint{ get; set; }
        [Column("actualLife")]
        protected int actualHitPoint{ get; set; }
        [Column("baseAgility")]
        protected int baseAgility{ get; set; }
    }

public class Hero : Character
    {
        [ForeignKey("weaponHolder")]
        public int WeaponHolderID { get; set; }
        [ForeignKey("backPack")]
        public int BackPackID { get; set; }
        [Column("Gold")]
        private int gold{ get; set; }
        public WeaponHolder weaponHolder{ get; set; }
        public List<SpecialItem> specialItems{ get; set; }
    }
公共类字符
{
[关键]
公共int字符{get;set;}
[列(“名称”)]
公共字符串名称{get;set;}
[专栏(“maxLife”)]
受保护的int-maxHitPoint{get;set;}
[列(“实际寿命”)]
受保护的int-actualHitPoint{get;set;}
[栏目(“BaseActivity”)]
受保护的int-baseAgility{get;set;}
}
公众阶级英雄:性格
{
[外国钥匙(“武器持有者”)]
公共int武器持有者ID{get;set;}
[外国钥匙(“背包”)]
公共ID{get;set;}
[栏目(“黄金”)]
private int gold{get;set;}
公共武器持有者武器持有者{get;set;}
公共列表特殊文件{get;set;}
}

我不确定我是否正确理解了您的答案。你的意思是我应该把
public int-WeaponHolderID{get;set;}
添加到我的
Hero
类中吗?我假设EF负责在一对一关系的情况下创建外键。它高度基于ID属性。没有真正的1对1关系;它总是将其中一方视为一对多。如果英雄是关系中的PK,是的,它应该有武器持有者ID作为属性,但是如果武器持有者是PK,英雄应该有武器持有者对象列表,没有武器持有者ID属性。我不确定我是否正确理解了你的答案。你的意思是我应该把
public int-WeaponHolderID{get;set;}
添加到我的
Hero
类中吗?我假设EF负责在一对一关系的情况下创建外键。它高度基于ID属性。没有真正的1对1关系;它总是将其中一方视为一对多。如果英雄是关系中的PK,则应该将WeaponHolderID作为属性,但如果WeaponHolder是PK,则英雄应该有一个WeaponHolder对象列表,并且没有WeaponHolderID属性。