2012-04-06 41 views
2

,我有以下数据模型:处理导航性能

enter image description here

我写了需要支持添加新报告一个WCF服务:

public bool CreateNewReport(Report report) 
    { 
     MyEntities context = new MyEntities(); 
     context.AddToReports(Report); 
     context.SaveChanges(); 
    } 

所以我的方法得到一个在客户端上生成的报表对象,并通过数据上下文将它添加到数据库中。 (所有成员都包含在DataContract中)

我的问题是关于导航属性。

  1. 客户端是否还需要创建一个用户对象并在发送之前将其放入新的报表对象中?
  2. 解决这个问题的最佳方法是什么?我想到的一种方式是在插入新报表时在ReportEntity
  3. 中添加一个UserId字段,如何更新使用新报表的UserEntity Report导航属性?

谢谢。

+1

一面注意:总是使用实体上下文,使用:'使用(var ctx = new MyEntities()){...}'。这将在使用块的末尾调用Dispose,这将释放所有使用的资源... – 2012-04-06 10:35:04

+0

@RicoSuter好点,谢谢 – Michael 2012-04-06 10:47:57

回答

1

如果导入数据库,生成导航属性(图片中的属性)和外部id属性(例如,您在报表类中具有User和UserID属性)。通过这种方式,您可以在客户端中设置UserID并将其发送到服务器,并将其添加到AddToReports ...如果您发送整个用户对象,则必须将其附加到实体环境,否则将再次创建用户。 。

连接引用的用户:(但最好只用ID发送用户)

public bool CreateNewReport(Report report) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.AddToReports(Report); 
     context.Users.Attach(report.User); 
     context.SaveChanges(); 
    } 
} 

要更改用户的报告:

public bool ChangeUserToNewReport(int userid, Report newReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = newReport; 
     context.SaveChanges(); 
    } 
} 

现有报表:

public bool ChangeUserReport(int userid, Report existingReport) 
{ 
    using (MyEntities context = new MyEntities()) 
    { 
     context.Reports.Attach(existingReport); 
     var user = context.Users.Single(u => u.ID = userid); 
     user.Report = existingReport; 
     context.SaveChanges(); 
    } 
} 

这是您的模型应该是什么样子的示例。双击关联线打开对话框。你可以看到PersonPersonID属性是相同的。如果你像这样创建你的模型,VS应该生成正确的SQL。 enter image description here

+0

谢谢,你介意我怎么做,如果我有UserID外部id属性在你建议的报告课上?我如何让用户表知道新的报告? – Michael 2012-04-06 11:01:21

+0

我不明白你的问题。我假设你的数据库中已经有一个外键“ReportID”,从中导出了Report报道导航属性。使用'ReportID'和'Report'属性,你只有两种方法来访问这个外键(Report属性支持延迟加载等等)。 – 2012-04-06 11:04:37

+0

对不起,因为我是新手,而且我的数据库知识不是这样大。从我的理解你已经建议我应该添加另一个属性到'ReportEntity'命名'UserId'(而不是'UserEntity'上的PK),并在创建新报表时更新它。这样,我不需要创建一个用户对象,并将其封装在报表中,当我从客户端发送它。正确吗?除此之外,我与报告和用户有一对多关系 – Michael 2012-04-06 11:10:00