Entity Framework代码第一次错误保存
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; }
我的 "Main" 实体是 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
"manually"
heroContext.MyWeaponHolders.Add(hero.weaponHolder);
然后它会按预期保存 WeaponHolder
及其 Weapons
。
我注意到 EF 没有在 Hero
和 WeaponHolder
之间创建外键,但我确实手动添加了一个,并且没有注意到保存行为有任何变化。
为什么在我保存 Hero
时 EF 不自动保存我的 Hero
的 WeaponHolder
?我可以手动保存吗?如果是这样,我如何在保存他后立即检索我的 Hero
主键,以便手动 link 我的 WeaponHolder
外键为正确的值?
对于 Hero 中的单个实体(如 WeaponHolder 属性),它也会像
一样具有对其中 ID 的引用
public int WeaponHolderID { get; set; }
此实现中缺少这一点。您所指的关系是否设置正确?
多亏了 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; }
}
我无法理解 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; }
我的 "Main" 实体是 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
"manually"
heroContext.MyWeaponHolders.Add(hero.weaponHolder);
然后它会按预期保存 WeaponHolder
及其 Weapons
。
我注意到 EF 没有在 Hero
和 WeaponHolder
之间创建外键,但我确实手动添加了一个,并且没有注意到保存行为有任何变化。
为什么在我保存 Hero
时 EF 不自动保存我的 Hero
的 WeaponHolder
?我可以手动保存吗?如果是这样,我如何在保存他后立即检索我的 Hero
主键,以便手动 link 我的 WeaponHolder
外键为正确的值?
对于 Hero 中的单个实体(如 WeaponHolder 属性),它也会像
一样具有对其中 ID 的引用public int WeaponHolderID { get; set; }
此实现中缺少这一点。您所指的关系是否设置正确?
多亏了 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; }
}