由于关系问题,无法将行插入数据库

时间:2013-11-28 15:18:22

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

首先,我使用的是ASP.NET MVC 4和Entity Framework 5.这是我在MVC中的第一个项目。

我正在尝试在WorkLogs表中插入一行。我用代码优先方法创建了我的数据库。

这是我的WorkLogs模型(因为我创建了数据库,我没有对我的模型进行任何更改):

public class WorkLogs
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int WorkLogId { get; set; }
    [Required]
    public int Time { get; set; }
    [Required]
    public DateTime Date { get; set; }
    [Required]
    public DateTime CreatedDate { get; set; }
    [Required]
    public bool IsSent { get; set; }

    public virtual Users User { get; set; }
    public virtual Works Work { get; set; }
}

此模型已在数据库中创建此表:

db

这些是关系(对我来说似乎是正确的):

db

我正在尝试使用此代码在控制器中添加一个新行:

WorkLogs log = new WorkLogs()
{
    Time = iTime,
    Date = beginWeek.AddDays(i),
    CreatedDate = DateTime.Now,
    User = userObj, 
    Work = workObj, 
    IsSent = true
};

_db.WorkLogs.Add(log);
_db.SaveChanges();

当我运行它时,它会在_db.SaveChanges()中抛出异常;线。

  

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

我知道当我看到这个异常时,关系存在问题。而且我也理解我正在尝试将对象插入到需要整数的列中。但我不明白它创建了User_UserId和Work_WorkId列并为它们提供了int数据类型。但是在控制器中,它需要一个用户对象。

我的模特,控制器可能都错了。但正如我所说,我是EF和MVC的新手。

我应该将WorkLog插入数据库进行哪些更改?

我希望我能说清楚。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:7)

内部异常是SqlException。 " The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value&#34 ;.如果您搜索该消息,您很快就会找到原因:

您已将CreatedDate上的DateWorkLogs设置为合理的值,因此罪魁祸首很可能是CreatedDate和/或UpdatedDate Works

如果你还没有设置它们,那么它们的值将是.NET的默认值 - DateTime.MinValue - 年0001.尝试将其插入数据库并获得溢出,因为在Sql Server中最小值为SqlDateTime.MinValue - 1753年。

我建议您在构造函数中将CreatedDate的值设置为DateTime.Now,并将UpdatedDate的类型更改为可为空DateTime(默认值为null而不是DateTime.Min

答案 1 :(得分:1)

您可以使用ForeignKeyAttribute将导航属性与外键链接:

public class WorkLogs
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int WorkLogId { get; set; }

    [Required]
    public int Time { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public DateTime CreatedDate { get; set; }

    [Required]
    public bool IsSent { get; set; }

    public int Users_UserId { get; set; }

    public int Works_WorkdId { get; set; }

    [ForeignKey("Users_UserId")]
    public virtual Users User { get; set; }

    [ForeignKey("Works_WorkdId")]
    public virtual Works Work { get; set; }
}

答案 2 :(得分:0)

请务必注意,Entity Framework 不支持支持无符号数据类型,如下所示:

How to use unsigned int / long types with Entity Framework?

http://tektutorialshub.com/code-first-conventions-in-entity-framework/

如果您将任何主键设置为 UNSIGNED DATATYPE ,则不仅会出现此特定错误,还会出现与您的模型上的表关系相关的许多其他错误。