【发布时间】:2015-03-30 05:48:15
【问题描述】:
我有一个相当简单的类,它包含潜在的用户类型:
public class Core_UserType
{
[Key]
public long ID { get; set; }
[Required]
public String Name { get; set; }
[ForeignKey("TrackingInfo")]
public long ObjectID { get; set; }
public virtual Core_TrackingInfo TrackingInfo { get; set; }
}
为简洁起见,我排除了一些代码,但关键属性是TrackingInfo。这个实体(以及整个代码优先实体模型都在一个名为 EntityModel 的类库中。
该解决方案有 2 个 Web 应用程序项目(都是 ASP.Net MVC),它们都引用了这个类库。
在库本身中有一些代码插入了一些条目,其中一个是新的Core_UserType。当从应用程序 A 调用时,它会完美运行。问题是当从项目 B 调用时,代码失败(在插入一些其他对象之后):
保存不公开外键的实体时出错 他们关系的属性。 EntityEntries 属性将 返回 null,因为无法将单个实体标识为源 的例外。可以进行保存时的异常处理 通过在实体类型中公开外键属性更容易。看 InnerException 了解详情。
还有一个内部异常:
无效的列名 TrackingInfo_ID
我深入挖掘了堆栈跟踪,发现项目 B 正在尝试执行此 SQL:
INSERT [dbo].[Core_UserType]([Name], [ObjectID], [TrackingInfo_ID])
VALUES (@0, @1, @2)
SELECT [ID]
FROM [dbo].[Core_UserType]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()
显然TrackingInfo_ID 不存在(它应该使用ObjectID)所以它失败了。
问题是为什么项目 A 能够兑现 ForeignKey 属性而项目 B 不能?
【问题讨论】:
-
您能否展示您对 Core_TrackingInfo 的定义?我怀疑您正在尝试创建 1:1 或 1:0..1 关系,而您不能这样做。
-
是的,它像 1:1 一样使用,但定义为 1:many。 Core_TrackingInfo 方面有这个:
public virtual ICollection<Core_UserType> Core_UserTypes { get; set; }。至关重要的是,尽管项目 A 中这一切都很好,所以我认为模型本身没有任何问题。
标签: c# .net asp.net-mvc entity-framework ef-code-first