簡體   English   中英

數據庫計算的屬性,它是Entity Framework 6中的外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM