C# 为什么我会收到一封“信”;非Null成员的Null值";错误?

C# 为什么我会收到一封“信”;非Null成员的Null值";错误?,c#,entity-framework,C#,Entity Framework,我正在使用EF 6.0并在context.SaveChanges()上收到此错误(对于不可为Null的member.member:'Details')。该值不是null,但EF仍在抱怨它是: 这适用于两个“CrashDump”对象 为什么会发生这种情况 编辑: 以下是所有相关代码: try { if (Uri.CheckHostName(computer) != UriHostNameType.Unknown) { Ping pingSender = new P

我正在使用EF 6.0并在context.SaveChanges()上收到此错误(对于不可为Null的member.member:'Details')。该值不是null,但EF仍在抱怨它是:

这适用于两个“CrashDump”对象

为什么会发生这种情况

编辑:

以下是所有相关代码:

try
{
    if (Uri.CheckHostName(computer) != UriHostNameType.Unknown)
    {
        Ping pingSender = new Ping();
        PingOptions pingOptions = new PingOptions();

        pingOptions.DontFragment = true;
        byte[] buffer = Encoding.ASCII.GetBytes("abcde");
        int timeout = 1;
        PingReply pingReply = pingSender.Send(computer, timeout, buffer, pingOptions);

        string uncPath = String.Format("\\\\{0}\\c$\\windows\\minidump", computer);

        if (pingReply.Status == IPStatus.Success)
        {
            Computer computerObj = (from c in context.Computers
                                    where c.Name == computer
                                    select c).First();
            List<CrashDump> dumps = computerObj.Dumps;

            Process bsodViewProcess = new Process();
            bsodViewProcess.StartInfo.UseShellExecute = false;
            bsodViewProcess.StartInfo.Arguments = 
                string.Format("/loadfrom 1 /minidumpfolder \\\\{0}\\c$\\windows\\minidump /sxml dumps.xml", computer);
            bsodViewProcess.StartInfo.FileName = "BlueScreenView.exe";

            bsodViewProcess.Start();
            bsodViewProcess.WaitForExit();

            XDocument xDoc = XDocument.Load("dumps.xml");

            List<CrashDumpDetails> lstDumpDetails =
                (from dump in xDoc.Element("crash_list").Elements("item")
                    select new CrashDumpDetails
                    {
                        DumpFile = dump.Element("dump_file").Value,
                        CrashTime = dump.Element("crash_time").Value,
                        BugCheckString = dump.Element("bug_check_string").Value,
                        BugCheckCode = dump.Element("bug_check_code").Value,
                        Parameter1 = dump.Element("parameter_1").Value,
                        Parameter2 = dump.Element("parameter_2").Value,
                        Parameter3 = dump.Element("parameter_3").Value,
                        Parameter4 = dump.Element("parameter_4").Value,
                        CausedByDriver = dump.Element("caused_by_driver").Value,
                        CausedByAddress = dump.Element("caused_by_address").Value,
                        FileDescription = dump.Element("file_description").Value,
                        ProductName = dump.Element("product_name").Value,
                        Company = dump.Element("company").Value,
                        FileVersion = dump.Element("file_version").Value,
                        Processor = dump.Element("processor").Value,
                        CrashAddress = dump.Element("crash_address").Value,
                        StackAddress1 = dump.Element("stack_address_1").Value,
                        StackAddress2 = dump.Element("stack_address_2").Value,
                        StackAddress3 = dump.Element("stack_address_3").Value,
                        ComputerName = dump.Element("computer_name").Value,
                        FullPath = dump.Element("full_path").Value,
                        ProcessorsCount = dump.Element("processors_count").Value,
                        MajorVersion = dump.Element("major_version").Value,
                        MinorVersion = dump.Element("minor_version").Value,
                        DumpFileSize = dump.Element("dump_file_size").Value,
                        DumpFileTime = dump.Element("dump_file_time").Value
                    }).ToList();

            foreach (var file in Directory.GetFiles(String.Format("\\\\{0}\\c$\\windows\\minidump", computer)))
            {
                Console.WriteLine(String.Format("\t{0}", file));

                string fileName = Path.GetFileName(file);
                DateTime lastWriteTime = File.GetLastWriteTime(file);

                var existingDump = from d in dumps
                                    where d.FileName == Path.GetFileName(file)
                                    where d.Time.Truncate(TimeSpan.FromSeconds(1)) 
                                            == File.GetLastWriteTime(file).Truncate(TimeSpan.FromSeconds(1))
                                    select d;

                if (existingDump.Count() == 0)
                {
                    CrashDump dump = new CrashDump();
                    dump.FileName = Path.GetFileName(file);
                    dump.Time = File.GetLastWriteTime(file);

                    if (lstDumpDetails.Count > 0)
                    {
                        dump.Details = lstDumpDetails
                            .Where(d => Path.GetFileName(d.DumpFile) == dump.FileName)
                            .FirstOrDefault();
                    }

                    dumps.Add(dump);
                }
            }

            computerObj.Dumps = dumps;

            context.SaveChanges();
        }
    }
}
catch
{

}
试试看
{
if(Uri.CheckHostName(计算机)!=UriHostNameType.Unknown)
{
Ping pingSender=新Ping();
PingOptions PingOptions=新的PingOptions();
pingOptions.DontFragment=true;
byte[]buffer=Encoding.ASCII.GetBytes(“abcde”);
int超时=1;
PingReply PingReply=pingSender.Send(计算机、超时、缓冲区、pingOptions);
string uncPath=string.Format(“\\{0}\\c$\\windows\\minidump”,计算机);
if(pingReply.Status==IPStatus.Success)
{
Computer computerObj=(来自context.Computers中的c)
其中c.Name==计算机
选择c.First();
列表转储=计算机对象转储;
流程bsodViewProcess=新流程();
bsodViewProcess.StartInfo.UseShellExecute=false;
bsodViewProcess.StartInfo.Arguments=
string.Format(“/loadfrom 1/minidumpfolder\\\\\{0}\\c$\\windows\\minidump/sxml dumps.xml”,计算机);
bsodViewProcess.StartInfo.FileName=“BlueScreenView.exe”;
bsodViewProcess.Start();
bsodViewProcess.WaitForExit();
XDocument xDoc=XDocument.Load(“dumps.xml”);
列出详细信息=
(来自xDoc.Element(“崩溃列表”).Elements(“项目”)中的转储)
选择新建CrashDumpDetails
{
DumpFile=dump.Element(“dump_file”).Value,
CrashTime=dump.Element(“崩溃时间”).Value,
BugCheckString=dump.Element(“bug\u check\u string”).Value,
BugCheckCode=dump.Element(“bug\u check\u code”).Value,
Parameter1=dump.Element(“参数_1”).值,
Parameter2=dump.Element(“参数_2”).值,
Parameter3=dump.Element(“参数_3”).值,
Parameter4=dump.Element(“参数_4”).值,
CausedByDriver=dump.Element(“由驱动程序引起”).Value,
CausedByAddress=dump.Element(“由地址引起”).Value,
FileDescription=dump.Element(“文件描述”).Value,
ProductName=dump.Element(“产品名称”).Value,
公司=转储元素(“公司”)价值,
FileVersion=dump.Element(“文件版本”).Value,
处理器=转储元素(“处理器”)值,
CrashAddress=dump.Element(“崩溃地址”).Value,
StackAddress1=dump.Element(“stack\u address\u 1”).值,
StackAddress2=dump.Element(“stack_address_2”).值,
StackAddress3=dump.Element(“stack_address_3”).值,
ComputerName=dump.Element(“computer_name”).Value,
FullPath=dump.Element(“full_path”).Value,
ProcessorsCount=dump.Element(“处理器计数”).Value,
MajorVersion=dump.Element(“主版本”).Value,
MinorVersion=dump.Element(“次要版本”).Value,
DumpFileSize=dump.Element(“dump\u file\u size”).Value,
DumpFileTime=dump.Element(“dump\u file\u time”).Value
}).ToList();
foreach(Directory.GetFiles(String.Format(“\\\{0}\\c$\\windows\\minidump”,computer))中的var文件)
{
WriteLine(String.Format(“\t{0}”,file));
字符串文件名=Path.GetFileName(文件);
DateTime lastWriteTime=File.GetLastWriteTime(文件);
var existingDump=来自转储中的d
其中d.FileName==Path.GetFileName(文件)
其中d.Time.Truncate(TimeSpan.FromSeconds(1))
==File.GetLastWriteTime(File.Truncate(TimeSpan.FromSeconds(1))
选择d;
if(existingDump.Count()==0)
{
CrashDump dump=新的CrashDump();
dump.FileName=Path.GetFileName(文件);
dump.Time=File.GetLastWriteTime(文件);
如果(lstDumpDetails.Count>0)
{
dump.Details=lstDumpDetails
.Where(d=>Path.GetFileName(d.DumpFile)==dump.FileName)
.FirstOrDefault();
}
转储。添加(转储);
}
}
计算机对象转储=转储;
SaveChanges();
}
}
}
抓住
{
}

这是合理的,因为在不可为空的字段中,您尝试保存空值。您可以修复此问题,使数据库中的字段可为空,然后更新模型。

出现此问题的原因可能是您正在使用
FirstOrDefault()
设置
dump.Details
设置值。当生成的集合不包含任何元素时,会导致
null


检查该场景,并为其指定一个值以确保不会发生这种情况。

使您的字段为空,更新模型请阅读,但字段不是空的……那么为什么它会说它是空的呢?请参阅下面对答案的@Christos评论。在问题的屏幕截图中,似乎没有任何
null
值。你能提供更多的细节吗