Проблемы обновления / вставки с помощью Linq-to-SQL + дочерних отношений - PullRequest
0 голосов
/ 24 февраля 2010

Я изучаю LINQ, и у меня возникают проблемы со вставкой и обновлением за один раз. У меня есть таблица StatusReport (School, Customer, Time), где School является первичным ключом, и таблица Service (School, ServiceName, State и Version), где School является внешним ключом, а School + ServiceName является первичным ключом. .

Вот мой код обновления:

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); возвращает ноль, даже если данные есть.

Есть идеи?

1 Ответ

0 голосов
/ 24 февраля 2010

Ваша ошибка противопоставления первичного ключа говорит о том, что где-то в таблице есть повторяющееся значение, которое вы пытаетесь вставить новое значение. Таким образом, ваше новое значение будет дубликатом уже существующего значения.

Убедитесь, что это не так.

По второй ошибке: если Service - это объект, я не знаю, что ваш метод SingleOrDefault создаст этот объект для вас ...

Вы должны создать объект Service, а затем найти данные, которые хотите обновить, в своей базе данных, вставить их в объект Service, обновить объект и зафиксировать в вашей базе данных.

...