实体框架 - 无效的列名称'*_ID"

Cla*_*ein 80 .net c# entity-framework-4

我把这缩小到Code First和Database first EF之间的一些问题,但我不确定如何修复它.我会尽量保持清醒,但老实说,我自己也缺少一些理解.这是实体框架4.4

我继承了一个使用Entity Framework的项目,但许多实际文件都被删除了,没有真正的方法可以返回.我重新添加了EF(数据库优先)并复制了项目所围绕的T4设置.它生成了所有数据库模型的代码版本和DBContext代码文件.

如果我的连接字符串看起来像一个"正常"的.NET连接字符串,我得到一个关于无效列的错误名称"ProcessState_ID"不存在.ProcessState_ID根本不在代码库中,它不在EDMX文件或任何内容中.这似乎是查询中的一些自动EF转换.

当我使连接字符串与实体框架模型匹配时,它工作正常.

现在尝试将以前的代码与实体框架相匹配,我想保留"正常"的.NET连接字符串.

所以我在这里有两个问题:1.在代码中从普通连接字符串到EF连接字符串的好方法是什么?2.这里有另一个修复,我没有看到停止无效的列名错误?

dre*_*wid 74

检查您是否有任何ICollections.

我想到的是当你有一个引用一个表的ICollection并且它没有可以找到的列时,它会创建一个让你尝试在表之间建立连接.这种情况恰好发生在ICollection上并且让我"慌乱"试图解决这个问题.

  • 只是要清楚这个答案,因为它对我的情况最准确(但直到我发现问题之后才知道它).如果在检索Table时遇到与OtherTable_ID相关的错误,请转到OtherTable模型并确保其中没有ICollection <Table>.如果没有定义关系,框架将自动假定您必须具有到OtherTable的FK并在生成的SQL中创建这些额外属性. (33认同)
  • EF浪费了我4个小时 (10认同)
  • @NitinSawant那是吗?EF每天浪费我4个小时的所有重复和未附加的记录. (2认同)

Pri*_*ERO 50

对于那些没有立即理解其他2个答案的人(像我一样),这是一个迟到的条目.

所以...

EF正试图从PARENT TABLES KEY-REFERENCE映射到EXPECTED名称...并且因为...... FOREARIGN KEY名称在数据库CHILD TABLE关系中被"更改或缩短"...您将收到上面的消息.

(此修复版本可能因EF版本而异)

对我而言,修复是:
将"ForeignKey"属性添加到模型中

public partial class Tour
{
    public Guid Id { get; set; }

    public Guid CategoryId { get; set; }

    [Required]
    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(500)]
    public string Description { get; set; }

    [StringLength(50)]
    public string ShortName { get; set; }

    [StringLength(500)]
    public string TourUrl { get; set; }

    [StringLength(500)]
    public string ThumbnailUrl { get; set; }

    public bool IsActive { get; set; }

    [Required]
    [StringLength(720)]
    public string UpdatedBy { get; set; }

    [ForeignKey("CategoryId")]
    public virtual TourCategory TourCategory { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用.+1是我找到这个答案的唯一地方. (4认同)

Ben*_*Ben 34

神圣的牛 - 经过几个小时的尝试,我终于弄明白了.

我首先在做EF6数据库而且我想知道"扩展程度未知列"错误 - 由于某种原因它正在生成表名下划线列名,并试图找到一个不存在的列.

在我的例子中,我的一个表有两个外键引用另一个表中的同一个主键 - 如下所示:

Animals            Owners
=======            ======
AnimalID (PK)      Pet1ID    <- FK to AnimalID
                   Pet2ID    <- also FK to AnimalID
Run Code Online (Sandbox Code Playgroud)

EF产生了一些奇怪的列名状Owners_AnimalID1Owners_AnimalID2,继而又打破本身.

这里的诀窍是这些令人困惑的外键需要使用Fluent API在EF注册!

在主数据库上下文中,重写OnModelCreating方法并更改实体配置.最好,您将有一个单独的文件扩展EntityConfiguration该类,但您可以内联.

无论你怎么做,你都需要添加如下内容:

public class OwnerConfiguration : EntityTypeConfiguration<Owner>
{
    public OwnerConfiguration()
    {
        HasRequired(x => x.Animals)
            .WithMany(x => x.Owners)  // Or, just .WithMany()
            .HasForeignKey(x => x.Pet1ID);
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,EF将(可能)开始像你期望的那样工作.繁荣.

此外,如果您使用上面的可空列,您将得到相同的错误 - 只需使用.HasOptional()而不是.HasRequired().


这是让我超越驼峰的链接:

https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx

然后,Fluent API文档提供帮助,尤其是外键示例:

http://msdn.microsoft.com/en-us/data/jj591620.aspx

您也可以将配置放在密钥的另一端,如下所述:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx.

我现在遇到了一些新问题,但这是一个巨大的概念缺口.希望能帮助到你!


RAM*_*RAM 11

假设:

  • Table
  • OtherTable
  • OtherTable_ID

现在选择以下方法之一:


一个)

去掉 ICollection<Table>

如果您OtherTable_ID在检索时遇到一些错误Table,请转到您的OtherTable模型并确保您没有ICollection<Table>.如果没有定义关系,框架将自动假定您必须具有到OtherTable的FK并在生成的SQL中创建这些额外属性.

此答案的所有信用均归@LUKE所有.上面的答案是他在@drewid回答下的评论.我认为他的评论是如此简洁,然后我把它改写成答案.


B)

  • 添加OtherTableIdTable

  • 定义OtherTableIdTable数据库


Pro*_*ors 5

对我来说,造成这种行为的原因是使用 Fluent API 定义的映射存在问题。\n我有 2 个相关类型,其中类型 A 有可选的类型 B 对象,类型 B 有许多 A 对象。

\n\n
public class A \n{\n    \xe2\x80\xa6\n    public int? BId {get; set;}\n    public B NavigationToBProperty {get; set;}\n}\npublic class B\n{\n    \xe2\x80\xa6\n    public List<A> ListOfAProperty {get; set;}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经使用 Fluent api 定义了映射,如下所示:

\n\n
A.HasOptional(p=> p.NavigationToBProperty).WithMany().HasForeignKey(key => key.BId);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但问题是,类型 B 具有导航属性List<A>,所以结果我有SQLException Invalid column name A_Id

\n\n

我将 Visual Studio 调试附加到 EF DatabaseContext.Database.Log 以将生成的 SQL 输出到 VS 输出->调试窗口

\n\n
db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);\n
Run Code Online (Sandbox Code Playgroud)\n\n

生成的 SQL 与 B 表有 2 个关系 -> 一个具有正确的 id,另一个与A_Id

\n\n

问题在于,我没有将此B.List<A>导航属性添加到映射中。

\n\n

所以在我的例子中,正确的映射必须是这样的:

\n\n
A.HasOptional(p=> p.NavigationToBProperty).WithMany(x => x.ListOfAProperty).HasForeignKey(key => key.BId);\n
Run Code Online (Sandbox Code Playgroud)\n