2010-02-24 58 views
0

我在学习LINQ,并且在插入和更新时遇到问题。我有一个StatusReport表(学校,客户,时间),学校是主键,服务表(学校,服务名称,州和版本),学校是外键,School + ServiceName是主键。使用Linq-to-SQL +子关系更新/插入的问题

这里是我的更新代码:

public MockReport(int numDrives, int numServers, int numCameras, string customer, string school) 
{ 
    _school = school; 
    string c = "..."; 
    using (DataClasses1DataContext _context = new DataClasses1DataContext(c)) 
    { 
     _context.CommandTimeout = 60; 
     Random random = new Random(); 

     bool inserting = false; 
     _report = _context.StatusReports.SingleOrDefault(s => s.School == school); 
     if (_report == null) 
     { 
      _report = new StatusReport(); 
      inserting = true; 
     } 


     updateService("System Monitor", "Running", "1.0.0.0"); 


     _report.Customer = customer; 
     _report.School = school; 
     _report.Time = DateTime.Now; 

     if (inserting) 
     { 
      _context.StatusReports.InsertOnSubmit(_report); 
     } 

     _context.SubmitChanges(); 
    } 
} 

private void updateService(string serviceName, string state, string version) 
{ 
    Service service = _report.Services.SingleOrDefault(s => s.School == _school && s.ServiceName == serviceName); // returns null! 
    bool inserting = false; 
    if(service == null) 
    { 
     service = new Service(); 
     inserting = true; 
    } 
    service.ServiceName = serviceName; 
    service.State = state; 
    service.Version = version; 
    if(inserting) 
    { 
     _report.Services.Add(service); 
    } 
} 

插入是好的,但更新失败 - 我得到一个SQL异常:PRIMARY KEY约束“PK_dbo.Service”的相关规定。无法在对象'dbo.Service'中插入重复键。 该声明已被终止。

另外,Service service = _report.Services.SingleOrDefault(s => s.School == _school & & s.ServiceName == serviceName);即使数据存在,也会返回null。

任何想法?

回答

-1

您的主键约束错误告诉您,您试图插入新值的表中某处存在重复值。所以你的新值将是一个已经存在的值的重复。

检查情况并非如此。

在第二个错误:如果Service是一个对象,我不知道你的SingleOrDefault方法会为你创建该对象...

您应该创建服务对象,然后找到你想要的数据在数据库中进行更新,将其保存在Service对象中,更新对象并提交到数据库。

+0

我认为SingleOrDefault()会检索数据库中的对象。然后,我更改该对象,并调用SubmitChanges()将更改提交给该对象。 – 2010-02-24 19:42:22

+0

SingleOrDefault将从集合中获取一个项目,如果集合为null,则返回null。 – 2010-02-24 20:02:03

+0

SingleOrDefault总是在空集合上引发异常。当Func <>返回true时,重载SingleOrDefault(Func <>)将从集合中检索单个项目;如果未找到此类项目,则为null。 – 2010-11-25 04:46:31