C# 实体框架代码第一次错误保存
我在理解EF如何保存我的实体时遇到问题。 我有我的C# 实体框架代码第一次错误保存,c#,entity-framework,ef-code-first,local-database,C#,Entity Framework,Ef Code First,Local Database,我在理解EF如何保存我的实体时遇到问题。 我有我的DbContext: public DbSet<Hero> MyHeroes { get; set; } public DbSet<SpecialItem> SpecialItems { get; set; } public DbSet<Weapon> MyWeapons { get; set; } public DbSet<WeaponHolder> MyWeapo
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; }
它包含一个武器持有者
:
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;
}
public class WeaponHolder
{
[Key]
public int WeaponHolderID { get; set; }
[Column("weaponHolderSize")]
private int weaponHolderSize;
List<Weapon> weapons;
}
我正在创造一个英雄
并给他几件特殊装备
,还有一个武器持有者
和几件武器
。当我试图保存我的英雄时,使用
heroContext.MyHeroes.Add(hero);
它确实保存了它的特殊文件
,但不保存它的武器持有者
和内容。如果我使用“手动”保存我的武器持有者
然后按预期保存武器持有者
及其武器
我注意到EF没有在Hero
和WeaponHolder
之间创建外键,但我手动添加了一个,并且没有注意到保存组件中的任何更改
当我保存我的英雄时,为什么EF不自动保存我的英雄的武器持有者?我可以手动保存吗?如果是这样,我如何在保存我的Hero
主键后立即检索他,以便手动将我的WeaponHolder
外键链接到正确的值?对于Hero中的单个实体(如WeaponHolder属性),它还将包含对ID的引用,如
public int WeaponHolderID { get; set; }
这个实现中缺少了这一点。您所指的关系设置是否正确?如果在Hero中有一个实体(如武器持有者属性),它也会在其中引用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; }
}
公共类字符
{
[关键]
公共int字符{get;set;}
[列(“名称”)]
公共字符串名称{get;set;}
[专栏(“maxLife”)]
受保护的int-maxHitPoint{get;set;}
[列(“实际寿命”)]
受保护的int-actualHitPoint{get;set;}
[栏目(“BaseActivity”)]
受保护的int-baseAgility{get;set;}
}
公众阶级英雄:性格
{
[外国钥匙(“武器持有者”)]
公共int武器持有者ID{get;set;}
[外国钥匙(“背包”)]
公共ID{get;set;}
[栏目(“黄金”)]
private int gold{get;set;}
公共武器持有者武器持有者{get;set;}
公共列表特殊文件{get;set;}
}
多亏了布莱恩·梅森的帮助,我才使它开始工作。
为了能够正确检索我的属性,我缺少了很多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; }
}
公共类字符
{
[关键]
公共int字符{get;set;}
[列(“名称”)]
公共字符串名称{get;set;}
[专栏(“maxLife”)]
受保护的int-maxHitPoint{get;set;}
[列(“实际寿命”)]
受保护的int-actualHitPoint{get;set;}
[栏目(“BaseActivity”)]
受保护的int-baseAgility{get;set;}
}
公众阶级英雄:性格
{
[外国钥匙(“武器持有者”)]
公共int武器持有者ID{get;set;}
[外国钥匙(“背包”)]
公共ID{get;set;}
[栏目(“黄金”)]
private int gold{get;set;}
公共武器持有者武器持有者{get;set;}
公共列表特殊文件{get;set;}
}
我不确定我是否正确理解了您的答案。你的意思是我应该把public int-WeaponHolderID{get;set;}
添加到我的Hero
类中吗?我假设EF负责在一对一关系的情况下创建外键。它高度基于ID属性。没有真正的1对1关系;它总是将其中一方视为一对多。如果英雄是关系中的PK,是的,它应该有武器持有者ID作为属性,但是如果武器持有者是PK,英雄应该有武器持有者对象列表,没有武器持有者ID属性。我不确定我是否正确理解了你的答案。你的意思是我应该把public int-WeaponHolderID{get;set;}
添加到我的Hero
类中吗?我假设EF负责在一对一关系的情况下创建外键。它高度基于ID属性。没有真正的1对1关系;它总是将其中一方视为一对多。如果英雄是关系中的PK,则应该将WeaponHolderID作为属性,但如果WeaponHolder是PK,则英雄应该有一个WeaponHolder对象列表,并且没有WeaponHolderID属性。