簡體   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