如何使用 WCF 数据服务公开非持久属性?

Posted

技术标签:

【中文标题】如何使用 WCF 数据服务公开非持久属性?【英文标题】:How do I expose non persisted properties using a WCF Data Service? 【发布时间】:2011-04-27 09:05:54 【问题描述】:

我使用 Entity Framework 4 创建了一个实体模型,我通过 WCF 数据服务公开了该模型。我的一个实体需要定义不持久保存到数据库的属性,但实体模型设计器不允许您这样做。

为了解决这个问题,我将我的所有对象都定义为 POCO 对象,这允许您将非持久属性添加到您的对象,但不能添加到您的模型。

我遇到的问题是,因为这些非持久化属性只存在于对象本身而不是模型中,所以它们不会通过 WCF 数据服务公开。

有没有办法在实体模型中定义不持久化到数据库的属性?

提前感谢您的任何回复

瑞恩

【问题讨论】:

【参考方案1】:

模型的类是部分的。您可以在类的其他部分编写您的非持久属性。请写下这是否可行,因为我没有使用 WCF 数据服务,但每次我需要业务对象中未映射到数据库中字段的属性时,我都会这样做。

【讨论】:

不幸的是,这已经是我试图做的。但是,当您创建对 WCF 数据服务的服务引用时,这些属性不会出现在 Reference.cs 中。【参考方案2】:

我认为 ikirachen 在使用部分类来定义附加属性方面走在正确的轨道上。为了让 WCF 公开它们,您还必须使用 DataMember 特性标记这些属性。我创建了一个小型 WCF 服务来对此进行测试:

[ServiceContract]
public interface IService1

    [OperationContract]
    string DoStuff(User user);


public class Service1 : IService1

    public string DoStuff(User user)
    
        string result = string.Empty;
        foreach (Guid leadId in user.AssociatedLeadIds) 
        
            // This is going to console on client,
            // just making sure we can read the data sent to us
            result += leadId.ToString() + "\n";
        

        return result;
    


// partial entity model class
public partial class User

    // This is not persisted to our DB with the user model
    [DataMember]
    public ICollection<Guid> AssociatedLeadIds  get; set; 

这是客户端代码,显示了通过 WCF 公开的 AssociatedLeadId:

class Program

    static void Main(string[] args)
    
        User u = new User
        
            // Here we set our non-persisted property data
            AssociatedLeadIds = new Guid[] 
            
                Guid.NewGuid(),
                Guid.NewGuid(),
                Guid.NewGuid()
            ,
            // The rest are persisted properties
            ApplicationId = Guid.NewGuid(),
            UserName = "TestUser",
            LoweredUserName = "testuser",
            LastActivityDate = DateTime.Now,
            IsAnonymous = false
        ;

        using (Service1Client svc = new Service1Client())
        
            // Here we call the service operation 
            // and print the response to the console
            Console.WriteLine(svc.DoStuff(u));
        

        Console.ReadKey();
    

希望这会有所帮助!

【讨论】:

进一步充实了代码。如果您仍然无法通过 WCF 公开属性,请告诉我。 感谢您的输入 jlaneaz,不幸的是,这仍然不适用于使用 WCF 数据服务的我。我想我知道问题是什么。 Wcf 数据服务的服务引用似乎是从 EDMX 文件而不是代码库构建的,因此只有 EDMX 文件中存在的那些属性被序列化到服务引用中。

以上是关于如何使用 WCF 数据服务公开非持久属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 公开 DCOM

Service Fabric - 如何在外部公开 wcf 服务

在 WCF 自托管服务中指定 Singleton 服务

WCF 服务:可用于测试的公开可用服务 [关闭]

在 WCF 数据服务中使用枚举

WCF 托管在 Web 应用程序和兼容模式中