我有3个实体
打印机具有服务器和驱动程序属性
在我的代码中,我设置了一个IEnumerable< Printer>其中每个打印机实例都拥有自己的服务器和驱动程序实体。
现在,当我尝试将其提交给数据库时,我正在使用以下代码:
foreach (Printer p in printers)
{
printmanEntities _dc = new printmanEntities();
p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;
_dc.AddToPrinterSet(p);
_dc.SaveChanges();
}
假设我将获得每个Printer对象的记录,以及每个唯一的Driver和Server名称的单个记录。但实际结果是非常有线的。
上面的代码为每个唯一的Driver对象生成一条记录,但没有明显的原因为每个唯一的Server创建多条记录。并且所有打印机记录都指向单个服务器记录。
此外,如果我首先分配p.Server,那么我只获取服务器实体的唯一记录,但获取驱动程序实体的多条记录。
我做错了什么?
更新:用LINQ2SQL取代了EF,它就像我预期的那样工作。每个唯一实体只有一行。
答案 0 :(得分:0)
这表明dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name)返回null,但Driver调用返回一条记录。为什么?我不知道。查看SQL事件探查器,看看从DB服务器返回的内容。但它会解释你的结果。
更新:我想我可能已经知道这里发生了什么。尝试并更改您的代码如下。如果它有效,我会解释推理。
printmanEntities _dc = new printmanEntities();
_dc.AddToPrinterSet(p);
p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;
_dc.SaveChanges();
请注意,我在这里做的唯一事情就是改变操作顺序。
答案 1 :(得分:0)
奇怪的是,DataContainer不返回您附加到图形但未提交db作为查询结果的实体。因此,您无法获得添加的实体,但不能使用Select()。 ) - :