首先,我使用的是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插入数据库应该做些什么更改?
我希望我清楚自己.
任何帮助,将不胜感激.
内在的例外是SqlException
." 将datetime2数据类型转换为日期时间数据类型会导致超出范围的值 ".如果您搜索该消息,您很快就会找到原因:
您已设置CreatedDate
并Date
在WorkLogs
合理值,以便罪魁祸首很可能是CreatedDate
和/或UpdatedDate
在实例Works
.
如果你还没有设置它们,那么它们的值将是.NET的默认值 - DateTime.MinValue
- 年0001.尝试将其插入到数据库中并且你得到溢出,因为在Sql Server中最小值是SqlDateTime.MinValue
- 1753年.
我建议你在构造函数中设置CreatedDate
to 的值,DateTime.Now
并将类型更改为UpdatedDate
可为空DateTime
(默认值为null而不是DateTime.Min
)