为什么LINQ会抛出NotSupportedException?

时间:2014-11-27 10:30:28

标签: linq entity-framework ef-model-first

假设我们有一个名为Car的表,其中包含ID,Identification,ModelName,OwnerId等列,其中OwnerId指向Owner表中的主键。这一切都很好,但后来我们想在汽车上添加一个驱动程序,因为我们想知道在给定时间谁驾驶每辆车。

听起来很直接,对吧?只需创建一个Driver表并添加一个新的nullable(如果汽车在车库里没有驱动程序等)int列名为DriverId到Car表,用外键连接它们我们很好走。

我这样做了,并在模型设计器中更新了EDMX,以便显示新的表,列和外键。一切看起来都不错DriverId属性和Driver导航属性都在生成的代码中,并且还生成了新的Driver类。

现在,当我尝试使用这个新表并将驱动程序连接到汽车时,出现了一些非常错误的问题。看起来LINQ不知道DriverId列或驱动程序的外键(导航属性)。

  1. 如果我试着买一辆带有给定驾驶员的车:

    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.
    
  2. 我们想说要添加一辆带司机的新车:

    Car car = new Car{ blah, blah, etc, DriverId = driverId };
    db.Cars.Add(car);
    db.SaveChanges();
    

    这似乎工作正常。新车被插入数据库。唯一的问题是DriverId列是null,所以很明显它不能正常工作......

  3. 我猜这些东西是连通的。我只是不知道问题是什么。任何人都知道为什么或者我可以尝试一些建议吗?


    修改

    Car and Driver类是纯粹生成的代码,因此我确信它们看起来很熟悉:

    [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; }
    }
    

1 个答案:

答案 0 :(得分:0)

由于这个问题似乎已经固定并且工作进展顺利,我在这里将这个问题视为一个临时的回答&#34;只是为了留下工作的痕迹和确保带有事实/想法的评论不会消失。随意添加/修剪任何东西。
Eirik :如果你设法将其缩小到确切的原因,请写一个后续的答案来解释错误的原因以及为什么它会无声地编译而没有错误。只是不要忘记&#34;接受&#34;它;)或者如果你愿意,可以在这个&#34; chatlog&#34;的底部添加信息。我将这个答案公之于众,因此不会给予任何积分。


我:我也认为你的一个模型失去了同步性。 (..)一个常见的事情是重复条目或不更新模型空间之间的标识符。您是否可以尝试从头开始重新生成EDMX,或者您是否进行了太多的手动更改?


的Eirik:

  

我之前经历过不良更新,并通过删除模型中涉及的表格然后再运行其他更新来解决这些问题。至于从头开始再生EDMX ......没有。有大量的手动更改,所以我根本没有时间将其全部更改。我已经尝试删除此问题中涉及的表格,并且没有运气就读了它们。相同的错误/问题。


我:既然也生成了nav-props,我假设你有一个Driver属性?您是否尝试过使用对象?我的意思是,db.Cars.Where(x => x.Driver.Id == driverId) select cCar car = new Car{ blah, blah, etc, Driver = driverObject };?如果有效,它会在某处指示属性&lt; - &gt;列命名冲突(...)


的Eirik:

  

将x.DriverId == driverId更改为x.Driver.ID == DriverId会产生相同的错误消息(仅允许初始化程序,成员和导航属性)。司机应被视为导航财产,但它不是。 DriverId应该被认可为会员,但它不是。插入也无声地失败。也就是说,它插入但Car.DriverId为空。

我:导航道具不起作用。你的EDMX搞砸了,(..)我现在正在咀嚼三个EDMX部分,并验证所有列,道具,导航等是否正确相互引用。也可以做另一个测试:创建一个只包含这些表的新edmx,不要触摸它,保留生成的名称和(..)比较新edmx的内容与旧的大edmx并寻找差异。 (..)


的Eirik:

  

我已经创建了一个新的测试项目,并从头开始生成EDMX,并且按预期工作。所以我猜测这只是模型设计师更新混乱的一个非常糟糕的情况。我目前正在浏览两个EDMX文件并比较内容。还没有解决方案,但我怀疑我会找到它最终... zzZzzZ ..谢谢你的输入到目前为止!