2012-01-26 1 views
1

Я новичок в asp.net, C# и sql и могу использовать некоторые рекомендации. Я использую: ниже: db с инфраструктурой linq-to-entities. Мне нужно связать конкретный «Ride» с конкретным «Транспортным средством», но я точно не знаю, как это сделать. Я установил свойство навигации между этими двумя объектами, но теперь нужно, чтобы автомобиль держал ссылку на список пройденных маршрутов. Нужен ли мне отдельный столбец в транспортном средстве, чтобы провести этот список аттракционов? Может кто-нибудь, пожалуйста, покажет мне синтаксис для этого?LINQ to Entities Внешние ассоциации ключей

Вот код, который я в настоящее время, с комментариями в двух местах мне нужна помощь:

private void setNewRide(Ride newRide, int carNum) 
     { 
      using (myEntities = new RamRideOpsEntities()) 
      { 
       var assignedCar = (from car in myEntities.Vehicles 
           where (car.CarNum == carNum) 
           select car).FirstOrDefault(); 

       if (assignedCar != null && newRide != null) 
       {     

        Ride lastRide = assignedCar.Rides.LastOrDefault(); //HERE IS WHERE I NEED TO LOAD THE MOST RECENT 'RIDE' FOR THIS CAR, IS THIS CORRECT??? 

        if (lastRide != null) 
        { 
         lastRide.Status = "Completed"; 
         assignedCar.numRides = assignedCar.numRides + 1; 
         lastRide.TimeDroppedOff = DateTime.Now; 
         TimeSpan duration = (lastRide.TimeDroppedOff - lastRide.TimeDispatched).Value; 

         lastRide.ServiceTime = duration; 
         if (assignedCar.AvgRideTime == null) 
         { 
          assignedCar.AvgRideTime = duration; 
         } 
         else 
         { 
          assignedCar.AvgRideTime = TimeSpan.FromSeconds((((TimeSpan)assignedCar.AvgRideTime).Seconds + duration.Seconds)/assignedCar.numRides); 
         } 
        } 

        assignedCar.Status = "EnRoute"; 
        assignedCar.CurrPassengers = newRide.NumPatrons; 
        assignedCar.StartAdd = newRide.PickupAddress; 
        assignedCar.EndAdd = newRide.DropoffAddress; 

        //HERE IS WHERE I NEED TO ADD THE 'newRide' OBJECT TO THE LIST OF RIDES IN THE 'assignedCar' ..SYNTAX??? 

        newRide.TimeDispatched = DateTime.Now; 
        newRide.AssignedCar = carNum; 
        newRide.Status = "EnRoute"; 

        myEntities.SaveChanges(); 
        SelectCarUP.DataBind(); 
        SelectCarUP.Update();      
       } 
      } 
     } 

EDMX

+2

Если EF не делает что-то умный, о котором я не подозреваю, строка, которую вы прокомментировали как проблему, опирается на мифический естественный порядок, которого нет (по крайней мере, в том виде, в котором он больше всего верит) в SQL Server. Порядок этих Rides основан на том, что страница Sql-сервера вставляет запись, которая является только детерминированной, если вы знаете оставшееся на странице место и точный размер вставленных строк. Это маловероятно, поэтому используйте предложение 'OrderBy'. Вернемся к исходному вопросу, что не так с строкой кода, который вы прокомментировали? Исключение? Ничего не вернулся? – Smudge202

ответ

4

Для:

// HERE IS WHERE I NEED TO LOAD THE MOST RECENT 'RIDE' FOR THIS CAR, IS 
// THIS CORRECT??? 
Ride lastRide = assignedCar.Rides.LastOrDefault(); 

Использование:

Ride lastRide = assignedCar.Rides 
    .OrderByDescending(r => r.TimeDispatched) 
    .FirstOrDefault(); 

... и:

// HERE IS WHERE I NEED TO ADD THE 'newRide' OBJECT TO THE LIST OF RIDES 
// IN THE 'assignedCar' ..SYNTAX??? 

... Ваш Vehicle объект имеет свойство Rides коллекции уже по к вашей диаграмме модели, так что вы должны просто быть в состоянии сказать:

assignedCar.Rides.Add(newRide); 

Наконец - и чисто, как вопрос личного вкуса - вместо:

var assignedCar = (from car in myEntities.Vehicles 
        where (car.CarNum == carNum) 
        select car).FirstOrDefault(); 

Я хотел бы использовать:

var assignedCar = myEntities.Vehicles 
    .FirstOrDefault(car => car.CarNum == carNum); 
+0

Вы все рок, спасибо! Еще один вопрос .. в ответ на комментарий: выше: о неопределенном порядке ... когда я использую 'assignCar.Rides.Add (newRide)', это действительно так, что «поездки» не останутся в порядке добавлены, как в массиве? Я буду использовать предложение orderby в любом случае, но только в интересах обучения ... – SHeinema

+0

А, похоже, у меня все еще есть одна проблема ... При использовании инструкции assignCar.Rides.Add (newRide) я получаю следующее Исключение: «Связь между двумя объектами не может быть определена, поскольку они привязаны к различным объектам ObjectContext». Есть предположения? – SHeinema

+0

Удар, что, понял. Благодарю. – SHeinema