代码:
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引用。
相关问题:
答案 0 :(得分:8)
您的每个问题都需要单独的答案,但我会尝试尽可能简短地回答。
首先,在您提供的代码示例中,您将获得一个ChatRoom对象,然后尝试访问查询中未包含的相关对象(ChatMessages)。如果您按照建议关闭了延迟加载,那么您将需要在查询中包含Include(“ChatMessages”)调用,因此您的LINQ查询应如下所示:
ChatRoom cr = context.ChatRooms.Include("ChatMessages").FirstOrDefault(c => c.Id == chatRoomId);
请确保您的连接字符串也在您的配置文件中。
相关问题:
您可以以您选择的任何方式返回集合 - 我通常在List对象中完成它们(我认为这是常用方法),但您可以根据需要使用数组。要作为列表返回,请对查询使用.ToList()方法调用。
我不明白你在这里要做什么,你是否使用代码从EDMX文件创建数据库?我通常使用数据库优先方法,所以我创建表等,然后从数据库更新我的EDMX。即使您从模型生成数据库,也不必在代码中运行CreateDatabase,您应该能够针对数据库运行生成的脚本。如果您使用的是仅代码,则需要转储EDMX文件。
您通常可以将实体图表返回给客户端,应该处理好。
EF4应该只填充您需要的内容。如果使用延迟加载,则在引用它们并执行查询时(例如,执行ToList()操作),它将自动加载LINQ查询中未包含的内容。如果您的客户端显然跨越物理边界(例如服务边界),这将无法正常工作:)如果您不使用延迟加载,它将在您的查询中加载您告诉它的内容,这就是全部。< / p>
自我跟踪实体用于n层应用,其中对象必须跨物理边界(例如服务)传递。它们为每个对象生成代码的开销以跟踪其更改,它们还生成不依赖于EF4的POCO对象(但显然包含生成的代码,这些代码将使跟踪的更改与EF4跟踪器一起工作)。我说这取决于你的用法,如果你正在构建一个非常独立的小应用程序,并且在没有基础设施的情况下并不真正关心可测试性的分离,那么你不需要使用自我跟踪实体。我说只在需要时才使用框架功能,所以如果你不是在编写企业级应用程序(企业不一定要大,而是可扩展,高度可测试,高质量等),那么就不需要自己动手了。跟踪POCO。
我没有尝试,但你应该能够这样做 - 如果你不能让它工作,那将是一个单独问题的候选人:)