我正在尝试创建一个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)
希望任何人都可以为我清除这一点,因为它真的令人沮丧:)
答案 0 :(得分:1)
我不确定你真正感兴趣的是什么。您希望每种类型有多个实体集(又名MEST),我不知道它的支持程度如何。
超越这一点,并围绕DTO进行讨论......
如果您使用自定义提供商,则可以实施自己的IDataServiceMetadataProvider
和IDataServiceQueryProvider
。当您的服务启动时,您可以调用IDataServiceMetadataProvider来控制公开或隐藏的实体和属性 - 包括公开实体上实际不存在的属性。结果是您最终没有编写DTO课程的DTO。暴露的元数据是DTO。 This是创建自己的提供商的好资源。
在您的情况下,这不是100%的解决方案,因为您无法选择何时公开财产以及何时不公开。
希望这会有所帮助......