Wcf 向实体模型添加新对象时处理导航属性
我有以下数据模型: 我正在编写一个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(); } 因此,我的方法获取在客户机上创建的报表对象,并通过数据上下文将其添加到数据库中
public bool CreateNewReport(Report report)
{
MyEntities context = new MyEntities();
context.AddToReports(Report);
context.SaveChanges();
}
因此,我的方法获取在客户机上创建的报表对象,并通过数据上下文将其添加到数据库中。(所有成员均包含在数据合同中)
我的问题是关于导航属性
ReportEntity
谢谢。如果导入数据库,生成导航属性(图片中的属性)和外来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();
}
}