[英]Database computed property that is a foreign key in Entity Framework 6
我如何引用一個屬性作為插入數據庫計算字段(從視圖)的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中的System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding目標,PropagatorResult行,PropagatorResult originalRow,TableChangeProcessor處理器,布爾insertMode,Dictionary`2&outputIdentifiers,DbExpression&returning,Boolean&rowMustBeTouched)中。 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
back進行了測試,它工作了:/
情況是:
-我只能使用DatabaseGeneratedOption.Computed插入
-我只能使用DatabaseGeneratedOption.Identity更新
正如MSDN所說的 , DatabaseGeneratedOption.Computed
讓數據庫為插入和更新生成一個值,而DatabaseGeneratedOption.Identity
只對插入生成一個值,這很奇怪。
數據庫中定義為IDENTITY的列與COMPUTED的列不同。
當您插入新行時,數據庫引擎將為IDENTITY-Column創建一個新值(數字)。 例如,您可以將其用作主鍵/唯一鍵列。 您無法更新IDENTITY列。 您無法定義用於計算的公式。
當您想在表級別上計算時,可以使用計算列。 在這里,您必須定義一個公式。 當使用PERSISTED選項創建計算列時,SQL-Server會將計算值存儲在表中。 當您更新屬於計算列的列時,僅計算列會被更新。 持久的計算列可以是索引鍵列和外鍵的一部分。 當您不使用PERSISTED選項時,數據庫將不存儲計算的值。 因此,每當查詢需要計算列時就必須進行計算。
更新行時,請確保計算出的列不屬於要更新的列列表的一部分(在UPDATE語句的SET子句中)。
您只能在表之間定義外鍵,而不能在視圖之間定義外鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.