我有一个简单的 Entity Framework (EF) v4.1 code first 的代码:
PasmISOContext db = new PasmISOContext();
var user = new User();
user.CreationDate = DateTime.Now;
user.LastActivityDate = DateTime.Now;
user.LastLoginDate = DateTime.Now;
db.Users.Add(user);
db.SaveChanges();
user.Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") };
db.SaveChanges();
db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();
问题在于我遇到了一个错误
在保存不公开其关系的外键属性的实体时发生了错误。EntityEntries属性将返回null,因为无法将单个实体标识为异常来源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。有关详细信息,请参见InnerException。
在:
db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();
我不明白为什么相似的操作可以正常工作。是我的模型出了问题,还是ef-code-first有问题?
public class Avatar
{
[Key]
public int Id { get; set; }
[Required]
public string LinkInString { get; set; }
[NotMapped]
public Uri Link
{
get { return new Uri(LinkInString); }
set { LinkInString = value.AbsoluteUri; }
}
}
public class User
{
[Key]
public int Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public Avatar Avatar { get; set; }
public virtual ICollection<Question> Questions { get; set; }
public virtual ICollection<Achievement> Achievements { get; set; }
public DateTime CreationDate { get; set; }
public DateTime LastLoginDate { get; set; }
public DateTime LastActivityDate { get; set; }
}
db.Users.Add(user)
,否则这两个SaveChanges
没有任何意义。)你有任何额外的Fluent API映射吗? - SlaumaUser
表中的Avatar_Id
是Avatar
导航属性的外键列,这没问题。你是手动创建数据库表还是让EF创建数据库?目前我不知道你为什么会出现这个错误。你可以尝试按照异常中给出的建议,在User
类中添加一个外键属性:public int? AvatarId { get; set; }
,看看会发生什么。也许至少异常会揭示更多关于问题所在的细节。 - Slauma