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

时间:2010-10-19 09:09:39

标签: c# wcf entity-framework

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

为了解决这个问题,我已经将所有对象定义为POCO对象,这允许您向对象添加非持久属性,而不是模型。

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

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

提前感谢您的回复

瑞安

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为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公开的AssociatedLeadIds:

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();
    }
}

希望这有帮助!