我有一个相当简单的类,它包含潜在类型的用户:
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不是?
答案 0 :(得分:1)
您可以尝试以相反的方式执行此操作:这意味着另一个属性上的ForeignKey DataAnnotaion:
public long ObjectID { get; set; }
[ForeignKey("ObjectID")]
public virtual Core_TrackingInfo TrackingInfo { get; set; }
希望这有帮助!