【发布时间】:2015-07-01 10:35:10
【问题描述】:
我对 Linq 很陌生,但最近一直在使用它,并且越来越自信。我正在使用 EF 通过 MVC 项目中的上下文访问我的数据库。
在这种情况下,我想做的就是从我的一张表中获取所有数据。
var msgs = context.Messages.ToList();
我觉得这很好,但是当我以后使用该列表时:
foreach(Message m in msgs)
{
var info = context.Contacts.Where(x => x.Id == m.recipient.Id)
.Select(x => x.MobileNumber).FirstOrDefault();
}
Message 对象有一个强制的Recipient,它是一个联系人对象(我数据库中的另一个实体)。
我在上面的行中得到 NullArgumentException,因为消息对象的 Recipient 参数在我的列表中为空,尽管它们在数据库中不为空。
奇怪的是列表大小合适,所以进入了foreach循环。该列表已正确选择,但根据我的调试器,所有属性均为空。
对此感到困惑,我跑了这条线:
console.WriteLine(context.Messages.Select(x => x.Recipient.FirstName).FirstOrDefault());
第一条消息的收件人的名字被写入控制台。因此,当我单独选择时,我可以检索消息的收件人及其所有信息,但是当尝试检索整个表并将其存储在列表中时,收件人对象为空。
就像我说的,我从包含上下文的 MVC 项目外部访问它。我正在从另一个项目中使用它。然而,这个另一个项目包含对我的 MVC 项目的引用,该项目包含数据库的消息模型,另一个项目包含一个名为 Message 的不同类。这种模棱两可是问题的根源还是我正在做的事情有其他问题?
编辑我显然对我的问题造成了一些混乱。问题是,一旦我检索到列表,列表的大小是正确的,但列表中消息对象的参数为空。例如,如果我写:
foreach (Message m in msgs)
{
Console.WriteLine("List Element Exists");
if (m.Recipient != null)
{
Console.WriteLine(m.Recipient.FirstName);
}
}
我得到了输出:
List Element Exists
List Element Exists
List Element Exists
List Element Exists
对于列表中的每个元素。
JK
【问题讨论】:
-
Console.WriteLine(String) 不会在 null 参数上抛出异常。告诉确切的地方抛出异常。
-
当您调试它时,
null是什么确切?对于数据库中该字段为null的任何记录,我希望m.Text将是null。 -
如果 m 为 null 可能是映射问题。另外,是字符串类型的文本并直接映射到表格吗?
-
文本是数据库中的必填字段吗?
-
我很抱歉我简化了问题以尝试显示孤立的问题。请看编辑。空异常是指我的消息的收件人对象。我的消息有一个必需的收件人,它是一个联系人(我的数据库中的另一个实体)。
标签: c# asp.net-mvc linq entity-framework