Entity Framework代码第一次错误保存

Entity Framework Code first wrong saving

我无法理解 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; }

我的 "Main" 实体是 Hero,它继承自 Character:

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;
    }

它包含一个WeaponHolder:

public class WeaponHolder
    {
        [Key]
        public int WeaponHolderID { get; set; }
        [Column("weaponHolderSize")]
        private int weaponHolderSize;
        List<Weapon> weapons;
    }

里面可以包含几个Weapon:

 public class Weapon : Loot
    {
        [Column("name")]
        string name;
        [Column("WeaponType")]
        WeaponTypes weaponType;
    }

我正在创建一个 Hero 并给他几个 SpecialItems,以及一个 weaponHolder 和几个 Weapon。当我试图保存我的 Hero 时,使用

heroContext.MyHeroes.Add(hero);

它确实保存了它的 SpecialItems 但它不保存它的 WeaponHolder 和内容。如果我使用

保存我的 weaponHolder "manually"
heroContext.MyWeaponHolders.Add(hero.weaponHolder);

然后它会按预期保存 WeaponHolder 及其 Weapons

我注意到 EF 没有在 HeroWeaponHolder 之间创建外键,但我确实手动添加了一个,并且没有注意到保存行为有任何变化。

为什么在我保存 Hero 时 EF 不自动保存我的 HeroWeaponHolder?我可以手动保存吗?如果是这样,我如何在保存他后立即检索我的 Hero 主键,以便手动 link 我的 WeaponHolder 外键为正确的值?

对于 Hero 中的单个实体(如 WeaponHolder 属性),它也会像

一样具有对其中 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; }
    }