WCF数据合同中的EF导航属性

时间:2015-07-12 09:27:55

标签: entity-framework wcf

我正在尝试学习使用WCF合同的一些最佳实践。我有一个POCO实体类,如下所示:

public class Job : IOwnerEntity<int>, ILoggableEntity
{
    public int JobID { get; set; }
    public int JobtypeCodeID { get; set; }
    public string JobName { get; set; }
    public int CustomerID { get; set; }
    public int JobStatusID { get; set; }
    public DateTime CreationDate { get; set; }
    public DateTime ModifiedDate { get; set; }

    public virtual Customer Customer { get; set; }
    public virtual ICollection<JobUserAssignment> JobUsers { get; set; }

    public int OwnerEntityID
    {
        get
        {
            return JobID;
        }
        set
        {
            JobID = value;
        }
    }
}

现在,当我创建相应的数据合约时,是否建议在datacontract中包含导航属性(JobUserAssignment和Customer here)。详细说明,推荐的方式是以下哪种合同?

[ServiceContract]
interface IJobService
{
    Job GetJob(int id);//Gets job + job.Customer + job.JobUsers
}

[ServiceContract]
interface IJobService
{
    Job GetJob(int id);//Gets onlyjob 
    Customer GetCustome(int jobid);
    JobUserAssignment[] GetUsers(int jobid);
}

提前致谢,

与Pradeep

2 个答案:

答案 0 :(得分:1)

将服务层与数据模型联系起来并不是一种好习惯。您遇到的问题是随着您的数据模型的发展(新列,验证等),您的服务将需要与服务的消费者重新同步。

相反,将数据模型分开,并在WCF层显示不同的对象集。

以下示例已修改您的版本:

  • 用于表示数据库中的表的类
  • 表示从WCF发送的数据的类

以下是这些类的代码:

 phpspec run spec/Project/WorkerSpec.php:9

从这里,您使用// Data Layer --------------------- // In namespace Company.Data.Models public class Job : IOwnerEntity<int>, ILoggableEntity { public int JobID { get; set; } public int JobtypeCodeID { get; set; } public string JobName { get; set; } /* ... others here .... */ } // ----------------------------------- // Services Layer -------------------- // In namespace Company.Services.Contracts public interface IJobService { Company.Services.Contracts.Job GetJobBy(int id); } // In namespace Company.Services.Contracts [DataContract] public class Job { [DataMember] public int ID { get; set; } [DataMember] public string Name { get; set; } } 命名空间交换消息。原因是如果您的数据库有一个表的额外列(比如新的Company.Services.Contracts),那么任何消费者都不会受到影响。

JobCategory

答案 1 :(得分:1)

一如既往:取决于

如果您检索Job始终(或几乎总是)还需要客户和该职位的作业?然后使用方法#1,它始终返回所有内容。

如果您偶尔只需要客户和分配(仅占10%,20%的情况),并且如果检索该信息非常昂贵/效率低下,那么我会使用方法#2来加载真正需要的时候。

如果您总是需要这些信息,那么在一次通话中获取所有内容首选 - 让您的用户调用三种方法来获取所有内容,每次他需要的内容都是毫无意义的。

但是,如果只需要少量的情况下只需要额外的信息 - 那么每次检索Job时都没有必要完成所有工作 - 在这种情况下,请由用户决定当他需要额外的信息(或不需要它)时。