gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:17 25 4
gpt4 key购买 nike

我正在尝试制作一个 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)

看到了这种情况

希望有人能帮我解决这个问题,因为这真的很令人沮丧:)

最佳答案

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

除此之外,还有关于 DTO 的一般性讨论......

如果您使用自定义提供程序,您可以实现自己的 IDataServiceMetadataProviderIDataServiceQueryProvider。当您的服务启动时,您可以调用 IDataServiceMetadataProvider 来控制公开或隐藏哪些实体和属性——包括公开实体上实际上不存在的属性。结果是您最终得到了一个 DTO,而没有编写 DTO 类的代码。公开的元数据是 DTO。 This是创建您自己的提供商的好资源。

在您的情况下,这不是 100% 的解决方案,因为您无法有选择地选择何时公开和不公开属性。

希望这有助于...

关于c# - 我如何首先使用带有 ef 代码的 wcf 数据服务公开 dto 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16541927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com