使用Entity框架dbContext API问题构建应用程序

时间:2012-03-15 14:32:39

标签: wcf entity-framework entity-framework-4.1 n-tier-architecture dbcontext

我正在开发一个WCF服务应用程序。它将成为大型系统的一部分。它提供了一些业务逻辑,并基于实体框架4.1。我想将应用程序代码分为2层(VS,dll中的项目):Service(包含业务逻辑)和DAL。

我的项目中有这样的数据库模型

ClassModel
classID : int, PK
classIdentity : string
teacherName : string
statisticInfo : int
isRegistered : bool


StudentModel
studentID : int, PK
studentIdentity : string
classID : int, FK

为此,我使用dbContext模板生成代码,我得到:

public partial class ClassModel
{
    public ClassModel()
    {
        this.Student = new HashSet<StudentModel>();
    }
    public int ClassID { get; set; }
    public string ClassIdentity { get; set; }
    public string TeacherName  { get; set; }
    public int StatisticInfo { get; set; }
    public bool IsRegistered { get; set; }

    public virtual ICollection<TerminalModel> Terminal { get; set; }
}

public partial class StudentModel
{
    public int StudentID { get; set; }
    public string StudentIdentity { get; set; }
    public bool IsRegistered { get; set; }

    public virtual ClassModel Class { get; set; }
}

我想通过该服务仅公开一些此类信息,因此我将不同的模型作为数据合同:

[DataContract]
public class Clas{
    [DataMember]
    public string ClassIdentity {get;set;}
    [DataMember]
    public string TeacherName {get;set;}
    [DataMember]
    public string ClassMark {get;set;} //computed from statisticInfo
    [DataMember]
    public int NumberOfStudents {get;set;} //amount of students in this class
}

我的ServiceContract:

[OperationContract]
public void RegsterClass(Clas clas); //(if given clas does not exists adds it and) sets its isRegistered column to True
[OperationContract]
public Clas GetClass(string classIdentity);

正如您所看到的,某些字段不存在,其他字段正在计算中。 在这种情况下,我对如何正确构建应用程序有一些担忧。你能用你认为合适的方式编写实现接口方法的示例代码吗?

1 个答案:

答案 0 :(得分:0)

尝试使用T4模板

可以使用T4模板生成dbContext类,数据传输目标(稍后会详细介绍),接口以及模型中每个实体的所有两种方法:RegsterClass和GetClass。 (这会为每个实体转换为RegsterStudent,GetStudent等) 然后,您可以在NuGet上使用AutoMapper从Clas映射到ClassModel。

我已经实现了类似的东西。我没有通过网络传递任何基于dbcontext的实体。我为每个实体使用数据传输对象。因此,丰田实体拥有一个具有数据注释的ToyotaDto,并用于所有WCF CRUD操作。当“获取”一个toyotaDto时,我将丰田映射到ToyotaDto并返回Dto,当保存时,我将Dto映射到一个实体,当然删除是通过密钥完成的,因此不需要Dto。 您可以在线修改several(1) good(2) examples(3)以适应,如果您愿意,我可以粘贴我正在使用的一些模板。