【发布时间】:2016-05-28 21:11:39
【问题描述】:
我如何引用一个属性作为插入到数据库计算字段的 ForeignKey(从视图)?
我有以下:
public class PersonSite
{
public int Id {get;set;}
//...
public int PersonId {get;set;}
[ForeignKey("PersonId")]
public virtual Person Person {get;set;}
//...
}
public class Person
{
public Id {get;set;}
//...
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int? MainPersonSiteId { get; protected internal set; }
[ForeignKey("MainPersonSiteId")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public PersonSite MainPersonSite { get; protected internal set; }
//...
}
每当我尝试更新 Person 时,我都会收到以下异常:
消息:
ReferentialConstraint 中的依赖属性映射到 商店生成的列。列:'MainPersonSiteId'。堆栈跟踪:
在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding 目标,PropagatorResult 行,PropagatorResult originalRow, TableChangeProcessor 处理器、布尔型 insertMode、Dictionary`2& outputIdentifiers, DbExpression& 返回, Boolean& rowMustBeTouched) 在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildUpdateCommand(PropagatorResult oldRow、PropagatorResult newRow、TableChangeProcessor 处理器)在 System.Data.Entity.Core.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler 编译器)
在 Sql Server 12 的数据库中,Person 来自一个视图,其中 MainPersonSiteId 是从一个函数投影的。这是一个计算字段,不需要由 ORM 更新。
如何用 EntityFramework 定义它?
编辑:
我只是通过设置DatabaseGeneratedOption.Identity 而不是DatabaseGeneratedOption.Computed 设法使更新工作,但是我发现插入仍然损坏。所以我用DatabaseGeneratedOption.Computed 测试了插入,它......工作了:/
情况是:
- 我只能插入 DatabaseGeneratedOption.Computed
- 我只能使用 DatabaseGeneratedOption.Identity 进行更新
奇怪的是MSDN saysDatabaseGeneratedOption.Computed 让数据库为插入和更新生成一个值,而DatabaseGeneratedOption.Identity 只为插入生成一个值
【问题讨论】:
-
你能在数据库中做到这一点吗?您可以从计算列创建外键吗?如果您不能在数据库中执行此操作,我怀疑您可以使用 EF 执行此操作。如果你能做到,请展示一下。
-
@JotaBe,感谢您的评论。我认为 DatabaseGeneratedOption 只是说该属性是由数据库以某种方式处理的。引用自 MSDN,DatabaseGeneratedOption.Computed 的意思是:“数据库在插入或更新行时生成一个值。”而已。 EntityFramework 不应触及该字段。
-
EF 肯定会触及该字段来处理 FK。而且我认为您无法在数据库中创建该 FK。你可以吗?您如何期望 EF 做一些无法做到的事情?
标签: c# sql-server entity-framework entity-framework-6 computed-properties