C# 在WCF上公开实体框架数据类型

C# 在WCF上公开实体框架数据类型,c#,wcf,entity-framework,C#,Wcf,Entity Framework,编辑:我不知道你们是怎么做到的,但这个问题确实是重复的。见上文 目前,我手头上有一个WCF服务,它公开了一些基本操作: public interface IUniService { [OperationContract] bool IsUser(string userName); [OperationContract] User GetUserByUsername(string userName); } 我还有一个实体框架数据库正在运行。 下面是一些访问服务器

编辑:我不知道你们是怎么做到的,但这个问题确实是重复的。见上文

目前,我手头上有一个WCF服务,它公开了一些基本操作:

public interface IUniService
{
    [OperationContract]
    bool IsUser(string userName);

    [OperationContract]
    User GetUserByUsername(string userName);
}
我还有一个实体框架数据库正在运行。 下面是一些访问服务器的代码

public bool IsUser(string userName)
{
    using (UniDBEntities db = new UniDBEntities())
    {
        User a = new User();
        var user = db.Users.Where(p => p.UserName == userName).ToList();
        return (user.Count() != 0);
    }
}
但我的问题是,我想通过WCF服务公开一些当前在我的实体框架中的类。当我编写如下函数时:

User GetUserById(int id)

当我返回结果时,我的客户机似乎并不知道用户类是什么。如何将我的实体公开为数据成员?

我认为您无法轻松透明地断开EF对象与数据库的连接,但是您可以创建dto或poco并通过网络发送。对于读取不是问题,您可以发送只读数据,或者创建用于更新数据的专用方法,或者接收EF对象,发送和接收一个副本,适当地包装为poco/dto,然后使用更改对其进行更新

不过,最好以与db模式不同的方式对中间层进行建模。不过,请创建ita域模型,以便wcf方法和EF对象之间不存在1对1的映射。然后,您可以使您的wcf模型更适合调用者


以存储库模式为例。

请不要这样做。EF类从来就不是要被WCF使用的(循环属性会立刻破坏序列化程序,它们有一大堆你不想处理的垃圾)。请参阅:那么您需要一些代理类/DTO?嗯,那是。。。笨拙。无论如何,使用
返回db.Users.Any(p=>p.UserName==UserName)
代替查询。它将生成最高效的SQL。对于编辑,我们很神奇:)事实上,我们只是阅读和回答了很多问题,并记住足够多,我们可以发现重复!如果你指的是我标记为可能重复的链接,我实际上在几周前写下了答案:),并在阅读这个问题时记住了它。