实体框架代码首先错误保存

时间:2016-06-14 11:02:37

标签: 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> MyWeaponHolders { get; set; }

我的主要&#34;实体是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&#34;手动&#34;使用

heroContext.MyWeaponHolders.Add(hero.weaponHolder);

然后按预期执行保存WeaponHolder及其Weapons

我注意到EF没有在HeroWeaponHolder之间创建外键,但我确实手动添加了一个外键,并没有注意到保存配置中的任何更改。

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

2 个答案:

答案 0 :(得分:2)

使用Hero中的单个实体(如WeaponHolder属性),它也可以引用其中的ID,如

public int WeaponHolderID { get; set; }

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

答案 1 :(得分:0)

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