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

Wcf 向实体模型添加新对象时处理导航属性,wcf,entity-framework,ado.net-entity-data-model,Wcf,Entity Framework,Ado.net Entity Data Model,我有以下数据模型: 我正在编写一个WCF服务,该服务需要支持添加新报告: public bool CreateNewReport(Report report) { MyEntities context = new MyEntities(); context.AddToReports(Report); context.SaveChanges(); } 因此,我的方法获取在客户机上创建的报表对象,并通过数据上下文将其添加到数据库中

我有以下数据模型:

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

 public bool CreateNewReport(Report report)
    {
        MyEntities context = new MyEntities();
        context.AddToReports(Report);
        context.SaveChanges();
    }
因此,我的方法获取在客户机上创建的报表对象,并通过数据上下文将其添加到数据库中。(所有成员均包含在数据合同中)

我的问题是关于导航属性

  • 客户端是否还需要创建一个用户对象,并在发送之前将其放入新的报表对象中
  • 最好的方法是什么?我想到的一种方法是在
    ReportEntity
  • 插入新报告时,如何使用新报告更新UserEntity report nav属性

  • 谢谢。

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

    附加引用的用户:(但最好只通过id发送用户)

    要更改用户的报告,请执行以下操作:

    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();
        }
    }
    
    这是您的模型的外观示例。双击关联行以打开对话框。您可以看到
    Person
    PersonID
    属性是相同的。如果像这样创建模型,VS应该生成正确的SQL。

    一方面注意:始终将实体上下文与using一起使用:
    using(var ctx=new myenties()){…}
    。这将在using块的末尾调用
    Dispose
    ,这将释放所有已使用的资源…@ricoster好的一点,谢谢谢谢你,你介意告诉我如果我像你建议的那样在report类中有UserID-foreign-id属性,我会怎么做吗?我如何让用户表知道新报告?我不理解你的问题。我假设您的数据库中已经有一个外键
    ReportID
    ,从中派生
    Report
    导航属性?使用
    ReportID
    Report
    属性,您只有两种方法可以访问此外键(
    Report
    属性支持延迟加载等)。很抱歉,因为我是EF新手,我的数据库知识不是很好。据我所知,您建议我在
    ReportEntity
    中添加另一个名为
    UserId
    (不是
    UserEntity
    上的PK)的属性,并在创建新报告时更新它。这样,当我从客户端发送用户对象时,就不需要创建用户对象并将其封装在报表中。对的除此之外,我与报表和用户有一对多的关系,对吗。您只需在
    User
    中设置
    UserId
    而不是整个引用。您正在从数据库生成模型吗?
    User
    属性实际上不在您的数据库中,它只是一个使用外键的“虚拟”属性(我认为是一个整数,我假设它被称为
    UserId
    )要从users表中提取引用对象并创建.net对象,我实际上是使用VS中的
    generatedatabase from model
    工具从模型中创建数据库(该工具创建一个sql文件以在数据库上运行)。因此,我应该向
    ReportEntity
    模型添加一个
    UserId
    属性,并将其与来自客户端的报告一起传递。然后我使用
    context.AddToReports(Report)
    好的,然后我根据
    用户ID
    用户实体中搜索用户,但我是否也需要在那里进行更新?
    
    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();
        }
    }