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上并且让我"慌乱"试图解决这个问题.
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)
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_AnimalID1
和Owners_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()
.
这是让我超越驼峰的链接:
然后,Fluent API文档提供帮助,尤其是外键示例:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
您也可以将配置放在密钥的另一端,如下所述:
我现在遇到了一些新问题,但这是一个巨大的概念缺口.希望能帮助到你!
RAM*_*RAM 11
假设:
Table
OtherTable
OtherTable_ID
现在选择以下方法之一:
去掉 ICollection<Table>
如果您OtherTable_ID
在检索时遇到一些错误Table
,请转到您的OtherTable
模型并确保您没有ICollection<Table>
.如果没有定义关系,框架将自动假定您必须具有到OtherTable的FK并在生成的SQL中创建这些额外属性.
此答案的所有信用均归@LUKE所有.上面的答案是他在@drewid回答下的评论.我认为他的评论是如此简洁,然后我把它改写成答案.
OtherTableId
到Table
和
OtherTableId
的Table
数据库对我来说,造成这种行为的原因是使用 Fluent API 定义的映射存在问题。\n我有 2 个相关类型,其中类型 A 有可选的类型 B 对象,类型 B 有许多 A 对象。
\n\npublic 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\nA.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
我将 Visual Studio 调试附加到 EF DatabaseContext.Database.Log 以将生成的 SQL 输出到 VS 输出->调试窗口
\n\ndb.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);\n
Run Code Online (Sandbox Code Playgroud)\n\n生成的 SQL 与 B 表有 2 个关系 -> 一个具有正确的 id,另一个与A_Id
问题在于,我没有将此B.List<A>
导航属性添加到映射中。
所以在我的例子中,正确的映射必须是这样的:
\n\nA.HasOptional(p=> p.NavigationToBProperty).WithMany(x => x.ListOfAProperty).HasForeignKey(key => key.BId);\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
65011 次 |
最近记录: |