子实体不存在于实体框架中6

时间:2015-06-12 00:24:27

标签: c# entity-framework

我刚学习.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

方法结尾处两个对象的上下文状态为“未更改”

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() { }
}