2011-09-07 85 views
0

假设我有一个linq到sql类。我想通过wcf返回对象的datacontext。我已经使数据库成为单向的。如果我注释掉有关ToolboxDataContext的所有内容,我将WCF的作品getString()仅用于演示wcf服务的工作原理。wcf发送linq到sql DataContext

 
public interface Database() 
{ 
    [OperationContract] 
    ToolboxDataContext getCtx(); 

    [OperationContract] 
    string getString(); 
} 
public class test: Database 
     public ToolboxDataContext getCtx() 
     { 

      ToolboxDataContext ctx = new ToolboxDataContext(); 
      return ctx; 
     } 
public string getString() 
     { 
      return "WCF WORKS"; 
     } 


[DataContract] 
    public class Testing //my svc file 
    { 
     [DataMember] 
     public ToolboxDataContext ctx; 
     [DataMember ] 
     public string Id; 
    } 
+2

你说你的问题中的LINQ到SQL,所以我标记了这个问题。但是在下面的一个评论中,你说实体框架。不是一回事。 –

回答

3

是你的ToolboxDataContext Entity Framework的DataContext?假设它是...

我不确定通过网络发送整个数据上下文对象真的是你想要做的。它很可能不会从收到它的客户那里“工作”。就像你一样,你将无法运行Linq语句并且触发数据库任何东西......你可能只想返回数据实体(不是整个上下文),如here (MSDN),或者考虑使用WCF Data Services来代替?

我想一个很好的问题是;客户端将如何处理DataContext?

+0

+1它*绝对*不会'工作' –

+0

客户端应该能够在不知道数据库凭证的情况下进行CRUD。是实体框架。 – hidden

+0

感谢您提供数据服务链接。我深知这项技术。 – hidden

0

这似乎并非是一个真正的问题(你有什么问题,什么都问这个?)

不过,假设这个您要反馈就是你有一个想法 - 这不合理。这相当于向客户端发送数据库连接。您无法序列化&反序列化连接,然后重新使用它。

datacontext是一个对象,所以你应该能够序列化它,一旦你确保它用正确的属性装饰,但它封装了一个数据库连接。数据库连接无法序列化。从概念上讲,描述该连接的所有信息都可以通过WCF序列化并提供,但这可能会暴露系统中的安全漏洞。

使用LINQ-to-SQL DataContext的正确模式是实例化它,执行所需的任何数据库操作并将其处置。最好不要长期坚持下去,绝对不要将它发布在您的服务之外。

+0

感谢您的回复。基本上,我在问如何与数百个应用程序共享一个数据上下文。这样你就不必为每个应用程序创建一个datacontexgt。如果数据库结构发生变化,我将不得不更新100个数据环境,而不是提供上下文的服务。 – hidden

+0

您的服务应通过应用程序检索数据提供操作。应用程序本身不应该访问数据库。 –