我已经在网络项目上工作了几周,而且主要是考虑如何实现数据层。我选择了Entity Framework 4.1,代码第一个模型。
所以,在很多其他实体中,想想有N CHARACTER的PLAYER,可以在0..1 GUILD
public class Player
{
public int Id { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public bool IsLogged { get; set; }
public DateTime LastActivity { get; set; }
public DateTime LastLogin { get; set; }
public DateTime LastLogout { get; set; }
public string DisplayName { get; set; }
public string DefaultImage { get; set; }
public virtual Board Board { get; set; }
public virtual PlayerData PlayerData { get; set; }
public virtual ICollection<Character> Characters { get; set; }
}
public class Guild
{
public int Id { get; set; }
public string Name { get; set; }
public string DefaultImage { get; set; }
public virtual ICollection<Character> Characters { get; set; }
}
public class Character
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Player Player { get; set; }
public virtual Guild Guild { get; set; }
public virtual GuildRank GuildRank { get; set; }
public virtual Game Game { get; set; }
}
正如你所看到的,还有更多的实体和关系,但这会有效。
嗯,它没有,这段代码:
Character character = mod.Characters.Where(c => c.Player == player).FirstOrDefault();
引发异常:
无法创建“DataObjects.Player”类型的常量值。只要 支持原始类型(例如Int32,String和Guid') 这个背景。
我不明白为什么。
我也试过使用[Key]和[ForeingKey]属性,但我找不到它们! :S(虽然在System.Data.Entity.dll中的位置,但不是)。
所以在经历了这么多错误后,我开始想到也许我弄错了......
有关如何修复错误或转向其他方向的任何想法?
提前致谢。
答案 0 :(得分:1)
这是EF的愚蠢。您无法直接比较Player
。您必须比较ID,以便可以将您的查询重写为:
int playerId = player.Id;
Character character = mod.Characters.FirstOrDefault(c => c.Player.Id == playerId);