如何首先使用带有ef代码的wcf数据服务公开dto对象?

时间:2013-05-14 11:24:32

标签: c# entity-framework wcf-data-services odata dto

我正在尝试创建一个wcf数据服务,我不想访问数据库模型,但我想使用数据传输对象。我在互联网上已经阅读了很多关于如何实现这一点的内容,但我无法为我的问题找到一个好的答案。这是我第一次使用wcf数据服务,所以我有点缺乏经验。

这里是我的模型,使用Entity Framework链接到我的数据库

public class User
    {
        [Key]
        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }

        public string CountryCode { get; set; }
        public string PhoneNumber { get; set; }
        public ICollection<User> Contacts { get; set; }

        public virtual Language Language { get; set; }

        public User()
        {
            Contacts = new List<User>();
        }
    }

public class Message
    {
        [Key]
        public int MessageId { get; set; }
        public DateTime SentDate { get; set; }

        public virtual User Sender { get; set; }
        public virtual User Receiver { get; set; }

        public string Content { get; set; }

        public string OriginalCultureInfoEnglishName { get; set; }
        public string ForeignCultureInfoEnglishName { get; set; }
    }

public class Language
    {
        [Key]
        public int LanguageId { get; set; }
        public string CultureInfoEnglishName { get; set; }
    }

现在我创建了一个Service.svc,它有我的DatabaseContext,因此它可以直接访问我的数据库模型。我想要实现的是,当我查询我的服务时,我不想直接获取数据库模型,而是想获得DTO模型。

我的dto看起来如何的示例

public class UserDTO
    {
        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Country { get; set; }
        public string PhoneNumber { get; set; }

        public ICollection<ContactDTO> Contacts { get; set; }

        public virtual LanguageDTO Language { get; set; }

        public UserModel()
        {
            Contacts = new List<ContactDTO>();
        }
    }

public class ContactDTO
    {
        public int UserId { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }

        public string Country { get; set; }
        public string PhoneNumber { get; set; }

        public virtual LanguageDTO Language { get; set; }
    }

public class LanguageDTO
    {
        public int LanguageId { get; set; }
        public string CultureInfoEnglishName { get; set; }
    }

public class MessageDTO
    {
        public int MessageId { get; set; }
        public DateTime SentDate { get; set; }

        public virtual ContactDTO Sender { get; set; }
        public virtual ContactDTO Receiver { get; set; }

        public string Content { get; set; }

        public string OriginalCultureInfoEnglishName { get; set; }
        public string ForeignCultureInfoEnglishName { get; set; }
    }

现在是否可以通过创建一个我可以在service.svc中使用的不同上下文来实现这一点,还是有其他方法可以实现这一点?

例如,我想通过userid获取ContactDto,这是一个用户,但具有较少的属性,因为它们在客户端应用程序中不相关。我看到这是由一个uri http://localhost:54895/Service.svc/ContactDto(1)

发生的

希望任何人都可以为我清除这一点,因为它真的令人沮丧:)

1 个答案:

答案 0 :(得分:1)

我不确定你真正感兴趣的是什么。您希望每种类型有多个实体集(又名MEST),我不知道它的支持程度如何。

超越这一点,并围绕DTO进行讨论......

如果您使用自定义提供商,则可以实施自己的IDataServiceMetadataProviderIDataServiceQueryProvider。当您的服务启动时,您可以调用IDataServiceMetadataProvider来控制公开或隐藏的实体和属性 - 包括公开实体上实际不存在的属性。结果是您最终没有编写DTO课程的DTO。暴露的元数据是DTO。 This是创建自己的提供商的好资源。

在您的情况下,这不是100%的解决方案,因为您无法选择何时公开财产以及何时不公开。

希望这会有所帮助......