Предположим, у нас есть таблица под названием Car с такими столбцами, как ID, Identification, ModelName, OwnerId и т. Д., Где OwnerId указывает на первичный ключ в таблице Owner. Это все хорошо, но тогда мы хотим добавить к машине водителя, так как мы хотим знать, кто управляет каждым автомобилем в определенное время.Почему LINQ выбрасывает исключение NotSupportedException?
Звучит прямо, верно? Просто создайте таблицу драйверов и добавьте новую нулевую (нет драйвера, если автомобиль находится в гараже и т. Д.) Int column под названием DriverId на стол Car, подключите его с помощью внешнего ключа, и мы будем рады.
Я сделал это и обновил EDMX в дизайнере модели, так что появилась новая таблица, столбец и внешний ключ. Все выглядит хорошо. Свойство DriverId и свойство навигации драйвера находятся там в сгенерированном коде, а также генерируется новый класс драйвера.
Теперь, когда я попытался использовать эту новую таблицу и подключить драйверы к автомобилям, есть что-то очень не так. Похоже, что LINQ не знает о столбце DriverId или внешнем ключе (свойство навигации) для драйвера.
Если я пытаюсь получить автомобиль с данным водителем:
Car car = (from c in db.Cars.Where(x => x.DriverId == driverId) select c).FirstOrDefault();
Я ожидаю, чтобы получить автомобиль, если водитель в настоящее время вождения автомобиля или нуль в противном случае. Что я получаю сообщение об ошибке:
System.NotSupportedException: The specified type member 'DriverId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Допустим, мы хотим, чтобы добавить новый автомобиль с водителем:
Car car = new Car{ blah, blah, etc, DriverId = driverId }; db.Cars.Add(car); db.SaveChanges();
Это, кажется, работает хорошо. Новый автомобиль вставляется в базу данных. Единственное, что столбец DriverId имеет значение null, поэтому очевидно, что он не работает нормально ...
Я предполагаю, что все это связано. Я просто не понимаю, в чем проблема. Кто-нибудь знает, почему или какие-то предложения относительно того, что я могу попробовать?
EDIT:
автомобиля и водителя классы чисто сгенерированный код, поэтому я уверен, что они выглядят знакомыми:
[DataContract(IsReference = true)]
[KnownType(typeof(Owner))]
[KnownType(typeof(Driver))]
public partial class Car
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Identification { get; set; }
[DataMember]
public Nullable<int> OwnerId { get; set; }
[DataMember]
public Nullable<int> DriverId { get; set; }
//Navigation properties
[DataMember]
public virtual Owner Owner { get; set; }
[DataMember]
public virtual Driver Driver { get; set; }
}
[DataContract(IsReference = true)]
[KnownType(typeof (Car))]
public partial class Driver
{
//Constructor
public Driver()
{
this.Cars = new HashSet<Car>();
}
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
//Navigation properties
[DataMember]
public virtual HashSet<Car> Cars { get; set; }
}
Не могли бы вы выслать код своего лица? некоторое отображение? –
Если вы изменяете существующий EDMX, вам нужно сделать три изменения каждый раз, когда вы добавляете поле - добавьте его в модель хранилища, затем в концептуальную модель, а затем в картографию. Если один из этих трех отсутствует, он сломается. В отдельном примечании 'FirstOrDefault' берет предикат, поэтому вы можете написать' db.Cars.FirstOrDefault (x => x.DriverId == driverId) '. – dasblinkenlight
@dasblinkenlight Чтобы обновить datamodel, я использую модель viewer/designer/thingie в Visual Studio. Щелкните правой кнопкой мыши -> Обновить модель из базы данных ... Я делал это сотни раз, и у меня никогда не было этой проблемы раньше. Я знаю, что вы можете пропустить «Куда» и просто поместить предикат в FirstOrDefault. ReSharper обычно скулит об этом;) – Eirik