繁体   English   中英

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

[英]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; }

我的“主要”实体是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以及一个带有几个Weapon weaponHolder 当我尝试保存Hero ,使用

heroContext.MyHeroes.Add(hero);

它确实保存了SpecialItems但没有保存WeaponHolder和内容。 如果我确实使用weaponHolder “手动”保存了我的weaponHolder

heroContext.MyWeaponHolders.Add(hero.weaponHolder);

然后按预期方式保存WeaponHolder及其Weapons

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

为什么不能自动EF救了我的HeroWeaponHolder当我救了我的Hero 我可以手动保存吗? 如果是这样,我如何保存我的Hero主键,以便将我的WeaponHolder外键手动链接到正确的值?

对于Hero中的单个实体(例如WeaponHolder属性),它也将像其中引用ID

public int WeaponHolderID { get; set; }

该实现缺少该功能。 您所指的关系是否正确设置?

多亏了Brian Mains的帮助,我才得以使它正常工作。
为了能够正确检索我的属性,我错过了很多获取/设置方法。
而且我确实确实必须为每个键添加一个新的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; }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM