我刚学习.Net中的实体框架,来自Java的Hibernate背景。我正在使用“代码优先”,但我正在进行自己的数据库设置。我有一个带有多个子事件日志(SubmissionEvent)的父对象(Submission)。我使用属性创建我的父提交,然后使用属性创建我的SubmissionEvent。然后我将SubmissionEvent添加到Submission,并调用SaveChanges。
这会导致SQL异常,因为它不会保留数据库中NotNull列的SubmissionEvent属性。如果我使这些列可以为空,我最终得到一个完全填充的Submission行,以及SubmissionEvent表中的一行,其中包含Id,Submission_Id和其他字段的NULL。
我尝试过的事情:
重命名属性。当我这样做时,我得到一个SQL异常,说该列不存在。当我将属性重命名为正确的名称时,我不再收到错误但该属性未保存。
重建课程。这真的很奇怪。如果我创建一个名为“SubmissionLog”的新类,并自行保留它,它可以正常工作。当我将map作为Submission的子项时,它仍然是持久的,但它的基本属性不是。奇怪的是,如果我随后删除了与Submission的关联并将其恢复到原来的状态,那么该类仍然无法正确保存属性。
SQL跟踪。 SubmissionEvent的插入只是不包含一些属性。
我是否遗漏了一些秘密的Entity Framework配置文件?什么东西存储关系,做什么?我错误地处理了我对dbContext的附件吗?我搜索过类似的问题,但没有发现任何问题。
感谢您的时间。代码如下。
public class Submission {
[Key]
public int Id { get; set; }
public string FilePath { get; set; }
public virtual ICollection<SubmissionEvent> Events { get; set; }
public Submission()
{
Events = new List<SubmissionEvent>();
}
}
public class SubmissionEvent
{
[Key]
public int Id { get; set; }
public Submission Submission { get; set; }
public string Action;
public DateTime DateTime;
public SubmissionEvent() { }
}
public static void OnCreated(object source, FileSystemEventArgs e)
{
Console.WriteLine("Adding Submission: " + e.FullPath + " " + e.ChangeType);
StyxDbContext db = new StyxDbContext();
Submission submission = new Submission();
submission.FilePath = e.FullPath;
SubmissionEvent subEvent = new SubmissionEvent();
subEvent.Action = "Created";
subEvent.DateTime = DateTime.Now;
submission.Events.Add(subEvent);
db.Submissions.Add(submission);
db.SaveChanges();
//Console.Write("subContext = " + db.Entry<Submission>(submission).State + "\n");
//Console.Write("subEventContext = " + db.Entry<SubmissionEvent>(subEvent).State + "\n");
}
SQL跟踪
exec sp_executesql N'INSERT [dbo].[Submission]([FilePath])
VALUES (@0)
SELECT [Id]
FROM [dbo].[Submission]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 nvarchar(max) ',@0=N'C:\Watch\Solve - Copy (24).txt'
exec sp_executesql N'INSERT [dbo].[SubmissionEvent]([Submission_Id])
VALUES (@0)
SELECT [Id]
FROM [dbo].[SubmissionEvent]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 int',@0=1
方法结尾处两个对象的上下文状态为“未更改”
答案 0 :(得分:0)
在SubmissionEvent
类中,您使用的是公共字段而不是属性,这些字段不会保留。尝试将它们更改为属性。我也相信父参考必须是虚拟的。 EF中的约定是使所有引用属性都是虚拟的。
public class SubmissionEvent
{
[Key]
public int Id { get; set; }
public virtual Submission Submission { get; set; }
public string Action { get; set; }
public DateTime DateTime { get; set; }
public SubmissionEvent() { }
}