Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server 不存在的列或属性的列名无效_Sql Server_Entity Framework - Fatal编程技术网

Sql server 不存在的列或属性的列名无效

Sql server 不存在的列或属性的列名无效,sql-server,entity-framework,Sql Server,Entity Framework,我试图使用Entity Framework将一条记录保存到SQL Server数据库的地址表中,但在调用context.SaveChanges时,我收到一条异常消息:“更新条目时出错。有关详细信息,请参阅内部异常。”检查内部异常后,出现一条消息,“无效的列名‘电话号码’。” Address表没有“TelephoneID”列。它可能一次有一个,但我们肯定删除了它的任何痕迹;Address表的任何键、约束或索引中都没有提到这样的列。Address记录的实体类(我添加到上下文中的实例)没有“Telep

我试图使用Entity Framework将一条记录保存到SQL Server数据库的地址表中,但在调用context.SaveChanges时,我收到一条异常消息:“更新条目时出错。有关详细信息,请参阅内部异常。”检查内部异常后,出现一条消息,“无效的列名‘电话号码’。”

Address表没有“TelephoneID”列。它可能一次有一个,但我们肯定删除了它的任何痕迹;Address表的任何键、约束或索引中都没有提到这样的列。Address记录的实体类(我添加到上下文中的实例)没有“TelephoneID”“财产。电话表确实有一个“电话ID”列,但我没有以任何方式涉及它或它的实体类

这个错误可能来自哪里?先谢谢你

编辑--调试和查看上下文对象时,我们注意到Addresses属性的计算结果如下:

{SELECT 
1 AS [C1], 
[Extent1].[AddressID] AS [AddressID], 
[Extent1].[AddressTypeID] AS [AddressTypeID], 
[Extent1].[City] AS [City], 
[Extent1].[CompanyID] AS [CompanyID], 
[Extent1].[Country] AS [Country], 
[Extent1].[County] AS [County], 
[Extent1].[Extra] AS [Extra], 
[Extent1].[State] AS [State], 
[Extent1].[Street] AS [Street], 
[Extent1].[Zip] AS [Zip], 
[Extent1].[UpdateTimeStampUtc] AS [UpdateTimeStampUtc], 
[Extent1].[UpdateUserGUID] AS [UpdateUserGUID], 
[Extent1].[UpdateUserID] AS [UpdateUserID], 
[Extent1].[Telephone_TelephoneID] AS [Telephone_TelephoneID]
FROM [Sales].[Address] AS [Extent1]}    

我猜这是表中有这个列时留下的。由于我不知道该查询值是如何创建的,也不知道它存储在何处(解决方案范围内搜索“Telephone\u TelephoneID”未找到任何结果),我如何更正它?

如果数据库中存在外键关系,而这些关系在您的模型或模型映射中未得到处理,我相信EF将尝试确定(或弥补)要用于关系的列名。我认为,查看电话和地址表的模型定义将有助于回答这个问题。如果数据库中存在模型或模型映射未捕获的外键关系,则需要使用以下选项之一对这些关系进行说明:

  • 使用FluentApi在模型映射中指定外键

    modelBuilder.Entity<YourTable>()
        .HasForeignKey(c => c.YourForeignKeyId);
    

  • 如果数据库中存在在模型或模型映射中未处理的外键关系,我相信EF将尝试确定(或组成)用于该关系的列名。我认为,查看电话和地址表的模型定义将有助于回答这个问题。如果数据库中存在模型或模型映射未捕获的外键关系,则需要使用以下选项之一对这些关系进行说明:

  • 使用FluentApi在模型映射中指定外键

    modelBuilder.Entity<YourTable>()
        .HasForeignKey(c => c.YourForeignKeyId);
    

  • 简言之,Address有一个电话ID列时留下了一些元素,更新模型的实体类解决了这个问题

    有一个线索是错误的——我不知道我怎么会错过这个——应该是电话实体类如何拥有这个属性:

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Address> Addresses { get; set; }
    

    [表(“Sales.Address”)]
    公共部分类地址
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
    公共广播
    {
    AddressShipInfoes=新哈希集();
    }
    ...
    公共虚拟地址类型地址类型{get;set;}
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
    公共虚拟ICollection AddressShipInfoes{get;set;}
    }
    

    [表(“销售电话”)]
    公共半类电话
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
    公用电话
    {
    AddressShipInfoes=新哈希集();
    }
    ...
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
    公共虚拟ICollection AddressShipInfoes{get;set;}
    }
    
    因此,当然,现在可以检索地址或电话,并且通过延迟(或急切或显式)加载,可以获得引用它的AddressShipInfo记录。最重要的是,电话号码不再是地址查询的一部分


    感谢所有响应者,希望这能帮助到某人。

    简言之,当Address有一个电话ID列时,还剩下了一些元素,更新模型的实体类解决了这个问题

    有一个线索是错误的——我不知道我怎么会错过这个——应该是电话实体类如何拥有这个属性:

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Address> Addresses { get; set; }
    

    [表(“Sales.Address”)]
    公共部分类地址
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
    公共广播
    {
    AddressShipInfoes=新哈希集();
    }
    ...
    公共虚拟地址类型地址类型{get;set;}
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
    公共虚拟ICollection AddressShipInfoes{get;set;}
    }
    

    [表(“销售电话”)]
    公共半类电话
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
    公用电话
    {
    AddressShipInfoes=新哈希集();
    }
    ...
    [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
    公共虚拟ICollection AddressShipInfoes{get;set;}
    }
    
    因此,当然,现在可以检索地址或电话,并且通过延迟(或急切或显式)加载,可以获得引用它的AddressShipInfo记录。最重要的是,电话号码不再是地址查询的一部分


    感谢所有回复者,希望这对其他人有所帮助。

    edmx可能无法刷新!请尝试刷新edmxtry以更新您的edmx模型尝试运行SQL Profiler并执行insert语句以查找错误删除导航属性,将其从模型中排除或正确映射。谢谢,但我没有edmx。这
    [Table("Sales.Address")]
    public partial class Address
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Address()
        {
            AddressShipInfoes = new HashSet<AddressShipInfo>();
        }
        ...
        public virtual AddressType AddressType { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<AddressShipInfo> AddressShipInfoes { get; set; }
    }
    
    [Table("Sales.Telephone")]
    public partial class Telephone
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Telephone()
        {
            AddressShipInfoes = new HashSet<AddressShipInfo>();
        }
        ...
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<AddressShipInfo> AddressShipInfoes { get; set; }
    }