Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么LINQ抛出NotSupportedException?_Linq_Entity Framework_Ef Model First - Fatal编程技术网

为什么LINQ抛出NotSupportedException?

为什么LINQ抛出NotSupportedException?,linq,entity-framework,ef-model-first,Linq,Entity Framework,Ef Model First,假设我们有一个名为Car的表,其中包含ID、Identification、ModelName、OwnerId等列,其中OwnerId指向Owner表中的主键。这一切都很好,但是我们想为汽车添加一名驾驶员,因为我们想知道在给定时间谁驾驶每辆汽车 听起来很直接,对吧?只需创建一个Driver表,并在car表中添加一个名为DriverId的int列,将其与外键连接,我们就可以开始了 我这样做了,并在模型设计器中更新了EDMX,以便显示新的表、列和外键。一切看起来都很好。DriverId属性和驱动程序导

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

听起来很直接,对吧?只需创建一个Driver表,并在car表中添加一个名为DriverId的int列,将其与外键连接,我们就可以开始了

我这样做了,并在模型设计器中更新了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,所以显然它不能正常工作

  • 我猜这些东西是有联系的。我只是不明白问题是什么。有人知道为什么或者有什么建议我可以试试吗


    编辑

    Car和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; }
    }
    
    [DataContract(IsReference=true)]
    [知识类型(类型(所有者))]
    [知识类型(驾驶员类型))]
    公共部分车厢
    {
    [数据成员]
    公共int ID{get;set;}
    [数据成员]
    公共字符串标识{get;set;}
    [数据成员]
    公共可为空的OwnerId{get;set;}
    [数据成员]
    公共可为空的DriverId{get;set;}
    //导航属性
    [数据成员]
    公共虚拟所有者{get;set;}
    [数据成员]
    公共虚拟驱动程序{get;set;}
    }
    [DataContract(IsReference=true)]
    [知识类型(类型(汽车))]
    公共部分类驱动程序
    {
    //建造师
    公共司机()
    {
    this.Cars=newhashset();
    }
    [数据成员]
    公共int ID{get;set;}
    [数据成员]
    公共字符串名称{get;set;}
    //导航属性
    [数据成员]
    公共虚拟哈希集{get;set;}
    }
    
    由于问题似乎已经解决,工作正在进行中,因此我在这里粘贴经过修剪的讨论作为临时“答案”,只是为了留下工作的痕迹,并确保带有事实/想法的评论不会消失。您可以在此处随意添加/修剪任何内容。
    Eirik:如果你想把它缩小到确切的原因,请写一个后续的回答,解释什么是错误的,以及为什么它在没有错误的情况下以静默方式编译。只是别忘了“接受”它;)或者,如果你愿意,在这个“聊天日志”的底部添加信息。我将这个答案传达给大家,所以不会给任何分数


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


    艾瑞克:

    我以前遇到过错误的更新,通过从模型中删除相关的表,然后运行另一个更新来重新读取它们,从而解决了这些问题。至于从零开始重新生成EDMX…不。有大量的手动更改,所以我根本没有时间全部更改回来。我已经尝试删除这个问题中涉及的表格,并在没有运气的情况下阅读了它们。同样的错误/问题


    我:因为导航道具也是生成的,我假设你有一个驱动程序属性?你试过使用对象吗?我的意思是,
    db.Cars.Where(x=>x.Driver.Id==driverId)选择c
    Car-Car=new-Car{blah,blah等,Driver=driverObject}?如果这样做有效,它将指示propertycolumn命名在某处发生冲突(…)


    艾瑞克:

    将x.DriverId==DriverId更改为x.Driver.ID==DriverId将导致相同的错误消息(仅允许初始值设定项、成员和导航属性)。驱动程序应该被识别为导航属性,但它不是。DriverId应该被识别为成员,但它不是。插入也会自动失败。也就是说,它插入但Car.DriverId为null

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


    艾瑞克:


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


    如果要修改现有的EDMX,则每次添加字段时都需要进行三项更改—将其添加到存储模型,然后添加到概念模型,然后添加到映射。如果这三个中有一个不见了,它就要断了。另一方面,
    FirstOrDefault
    接受一个谓词,因此您可以编写
    db.Cars.FirstOrDefault(x=>x.DriverId==DriverId)
    .btw。正如dasblinkenlight所说,我也认为你们的一个模型失去了同步。我不知道它是如何在最新的EF版本,但在以前的版本