2

我有以下数据模型:

在此处输入图像描述

我正在编写一个需要支持添加新报告的 WCF 服务:

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

因此,我的方法获取在客户端上生成的报表对象,并通过数据上下文将其添加到数据库中。(所有成员都包含在 DataContract 中)

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

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

谢谢。

4

1 回答 1

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。 在此处输入图像描述

于 2012-04-06T10:54:50.000 回答