将新对象添加到实体模型时处理导航属性

时间:2012-04-06 10:24:57

标签: wcf entity-framework ado.net-entity-data-model

我有以下数据模型:

enter image description here

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

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

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

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

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

1 个答案:

答案 0 :(得分: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