EF代码第一个外键被忽略,得到“无效的列名”

时间:2015-03-30 05:48:16

标签: c# .net asp.net-mvc entity-framework ef-code-first

我有一个相当简单的类,它包含潜在类型的用户:

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调用时,代码失败(在插入其他一些对象之后OK):

  

保存不公开外键的实体时发生错误   他们关系的属性。 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不是?

1 个答案:

答案 0 :(得分:1)

您可以尝试以相反的方式执行此操作:这意味着另一个属性上的ForeignKey DataAnnotaion:

public long ObjectID { get; set; }

[ForeignKey("ObjectID")]
public virtual Core_TrackingInfo TrackingInfo { get; set; }

希望这有帮助!