我在理解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没有在Hero
和WeaponHolder
之间创建外键,但我确实手动添加了一个外键,并没有注意到保存配置中的任何更改。
为什么当我保存Hero
时,EF不会自动保存WeaponHolder
Hero
?我可以手动保存吗?如果是这样,我如何在保存后立即检索Hero
主键,以便手动将我的WeaponHolder
外键链接到正确的值?
答案 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; }
}