【发布时间】:2011-12-17 19:29:26
【问题描述】:
我有一个简单的代码在Entity Framework 4.1 代码优先:
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; }
}
【问题讨论】:
-
我无法重现该错误。你能检查第一个代码sn-p吗?这正是你正在做的吗? (至少一个
db.Users.Add(user)似乎丢失了,否则2 个SaveChanges没有意义。)你有任何额外的Fluent API 映射吗? -
谢谢斯劳马。我已经编辑了我的代码。我没有任何 Fluent API。第一个和第二个 SaveChanges 将行添加到 Avatars 和 Users 表。我不知道这是否重要,但在表中我有 Avatar_Id 列。
-
Avatar_IdinUsertable 是Avatar导航属性的外键列,没关系。您是手动创建数据库表还是让 EF 创建数据库?目前我不知道你为什么会收到这个错误。您可以尝试遵循异常中给出的建议并将外键属性添加到您的User类:public int? AvatarId { get; set; }并看看会发生什么。也许至少这个例外会揭示问题的更多细节。 -
我让 EF 创建数据库。正如你所说,我已经添加了这个属性,现在它工作正常 - 现在我有 AvatarId 而不是 Avatar_Id 并且它保持正确的头像。这很奇怪,但感谢您帮助我。
-
您可以将其发布为 FK 属性已解决问题的答案,然后接受您的答案,以完成此问题。我不明白为什么它解决了你的问题,对我来说它在没有 FK 属性的情况下也可以工作。
标签: c# entity-framework ef-code-first entity-framework-4.1