首先,我使用的是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; }
}
此模型已在数据库中创建此表:
这些是关系(对我来说似乎是正确的):
我正在尝试使用此代码在控制器中添加一个新行:
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插入数据库进行哪些更改?
我希望我能说清楚。
任何帮助都将不胜感激。
答案 0 :(得分:7)
内部异常是SqlException
。 " The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value&#34 ;.如果您搜索该消息,您很快就会找到原因:
您已将CreatedDate
上的Date
和WorkLogs
设置为合理的值,因此罪魁祸首很可能是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 ,则不仅会出现此特定错误,还会出现与您的模型上的表关系相关的许多其他错误。