为什么我的导航属性在Entity Framework 4中为空?

时间:2010-10-10 16:30:06

标签: sql wcf entity-framework

代码:

public ChatMessage[] GetAllMessages(int chatRoomId)
{
  using (ChatModelContainer context = new ChatModelContainer(CS))
  {
    //var temp = context.ChatMessages.ToArray();
    ChatRoom cr = context.ChatRooms.FirstOrDefault(c => c.Id == chatRoomId);
    if (cr == null) return null;
    return cr.ChatMessages.ToArray();
  }
}

问题:

该方法(WCF服务的一部分)返回一个空数组。如果我取消注释注释行,它将按预期开始工作。我试过转动延迟加载,但它没有帮助。

此外,当它工作时,我得到ChatMessages,其中包含对填充的ChatRoom的引用,但不是ChatParticipant。它们都由模式中的ChatMessage实体引用,具有Id和Navigation属性。设置了ID并指向正确的实体,但在客户端只填充了ChatRoom引用。

相关问题:

  1. 数组是返回像这样的EF实体集合的首选方法吗?
  2. 在我的模型中进行更改(edmx)我需要在运行context.CreateDatabase()之前运行“从模型中生成数据库...”选项。为什么?我收到一些指向旧SSDL的错误消息,但我无法找到SSDL的存储位置。这是在我运行“Generate Database ...” - 选项吗?
  3. 时创建的
  4. 将整个实体图表返回给客户端是否安全?我已经阅读了一些关于“循环参考exeptions”但是在EF4中修复了吗?
  5. EF4中如何以及何时填充参考?如果我启用了延迟加载,我怀疑只有我触摸的实体被填充?但是,如果关闭延迟加载,那么是否应该总是填充整个图形?
  6. 在EF4中使用自我更新实体比普通实体有任何缺点吗?我现在不需要自我更新,但我可能会在以后做。我可以轻松升级,还是应该从一开始就进行自我更新?
  7. 为什么我不能使用带字符串类型的实体键?

1 个答案:

答案 0 :(得分:8)

您的每个问题都需要单独的答案,但我会尝试尽可能简短地回答。

首先,在您提供的代码示例中,您将获得一个ChatRoom对象,然后尝试访问查询中未包含的相关对象(ChatMessages)。如果您按照建议关闭了延迟加载,那么您将需要在查询中包含Include(“ChatMessages”)调用,因此您的LINQ查询应如下所示:

ChatRoom cr = context.ChatRooms.Include("ChatMessages").FirstOrDefault(c => c.Id == chatRoomId);

请确保您的连接字符串也在您的配置文件中。

相关问题:

  1. 您可以以您选择的任何方式返回集合 - 我通常在List对象中完成它们(我认为这是常用方法),但您可以根据需要使用数组。要作为列表返回,请对查询使用.ToList()方法调用。

  2. 我不明白你在这里要做什么,你是否使用代码从EDMX文件创建数据库?我通常使用数据库优先方法,所以我创建表等,然后从数据库更新我的EDMX。即使您从模型生成数据库,也不必在代码中运行CreateDatabase,您应该能够针对数据库运行生成的脚本。如果您使用的是仅代码,则需要转储EDMX文件。

  3. 您通常可以将实体图表返回给客户端,应该处理好。

  4. EF4应该只填充您需要的内容。如果使用延迟加载,则在引用它们并执行查询时(例如,执行ToList()操作),它将自动加载LINQ查询中未包含的内容。如果您的客户端显然跨越物理边界(例如服务边界),这将无法正常工作:)如果您不使用延迟加载,它将在您的查询中加载您告诉它的内容,这就是全部。< / p>

  5. 自我跟踪实体用于n层应用,其中对象必须跨物理边界(例如服务)传递。它们为每个对象生成代码的开销以跟踪其更改,它们还生成不依赖于EF4的POCO对象(但显然包含生成的代码,这些代码将使跟踪的更改与EF4跟踪器一起工作)。我说这取决于你的用法,如果你正在构建一个非常独立的小应用程序,并且在没有基础设施的情况下并不真正关心可测试性的分离,那么你不需要使用自我跟踪实体。我说只在需要时才使用框架功能,所以如果你不是在编写企业级应用程序(企业不一定要大,而是可扩展,高度可测试,高质量等),那么就不需要自己动手了。跟踪POCO。

  6. 我没有尝试,但你应该能够这样做 - 如果你不能让它工作,那将是一个单独问题的候选人:)