保存不公开其关系的外键属性的实体时发生错误

use*_*618 50 c# entity-framework ef-code-first entity-framework-4.1

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();
Run Code Online (Sandbox Code Playgroud)

问题是我收到了错误

保存不公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源.通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常.有关详细信息,请参阅InnerException.

db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我不明白为什么类似的操作有效.我的模型或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; }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*ral 165

对于那些仍然会在正确定义所有键的情况下出现此错误的人,请查看您的实体并确保不留下具有空值的datetime字段.

  • 如果查看内部异常,则会出现"System.Data.SqlClient.SqlException"类型的异常,并带有消息:"将datetime2数据类型转换为日期时间数据类型会导致超出范围的值." 这是因为将DateTime值插入到不允许使用空值的列中.请参阅http://stackoverflow.com/questions/1331779/c-sharp-conversion-of-a-datetime2-data-type-to-a-datetime-data-type. (7认同)

Dav*_*ock 15

出于任何原因,可能会抛出此错误消息.'InnerException'属性(或其InnerException,或者InnerException等)包含问题的实际主要原因.

了解问题发生的地方当然是有用的 - 工作单元中的哪个对象导致问题?异常消息通常会在"EntityEntries"属性中告诉您,但在这种情况下,由于某种原因,无法完成.这种诊断复杂性 - 'EntityEntries'属性为空 - 显然是因为某些实体不会为其关系公开外键属性.

即使OP由于未能DateTime为第二个实例初始化s 而得到错误User,它们也会得到诊断并发症 - 'EntityEntries'为空,以及令人困惑的顶级消息......因为其中一个实体没有'暴露外键属性'.要解决此问题,Avatar应该public virtual ICollection<User> Users { get; set; }定义一个属性.


use*_*618 6

通过添加FK属性解决了该问题.