2016-06-14 93 views
0

我在理解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并给他几个SpecialItemsweaponHolder以及几个Weapon。当我试图挽救我的Hero,使用

heroContext.MyHeroes.Add(hero); 

它并保存它的SpecialItems但它不保存其WeaponHolder和内容。如果我不救我weaponHolder“手动”使用

heroContext.MyWeaponHolders.Add(hero.weaponHolder); 

那么它确实如预期保存WeaponHolder及其Weapons

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

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

回答

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

随着英雄一个单一的实体(如WeaponHolder属性),它也有一个像

public int WeaponHolderID { get; set; } 

。这就是执行缺少参考它的ID。您所说的关系正确吗?

+0

我不知道我理解正确答案。 你的意思是我应该加上'public int WeaponHolderID {get;组; }'到我的'英雄'级? 我假设EF负责在一对一关系的情况下创建外键。 – Belterius

+0

它高度依据存在ID属性。没有真正的1对1关系;它总是将其中一方视为一对多。如果英雄是关系中的PK,是的它应该有WeaponHolderID作为属性,但是如果WeaponHolder是PK,英雄应该有一个WeaponHolder对象列表并且没有WeaponHolderID属性。 –