2012-07-25 17 views
1

我有兩個表以下定義:協會從不同的表EF單一屬性的4.3

CREATE TABLE [dbo].[Shows] (
    [Id]    UNIQUEIDENTIFIER NOT NULL, 
    [Name]   NVARCHAR (1024) NOT NULL, 
    [Image]   NVARCHAR (1024) NULL, 
    [Description]  NTEXT   NULL, 
    [Seasons]   INT    NOT NULL, 
    [FacebookId]  BIGINT   NULL, 
    [BackgroundImage] NVARCHAR (200) NULL, 
    [TheTvDbId]  BIGINT   NULL, 
    [NetworkId]  UNIQUEIDENTIFIER NOT NULL, 
    CONSTRAINT [PK_Shows] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_Shows_ToNetworks] FOREIGN KEY ([NetworkId]) REFERENCES [dbo].[Networks] ([Id]) 
); 

     CREATE TABLE [dbo].[TheTvDb] 
    (
     [Id] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL, 
     [EntityId] UNIQUEIDENTIFIER NOT NULL, 
     [TheTvDbId] BIGINT NOT NULL, 
     [LastUpdated] BIGINT NOT NULL DEFAULT 0, 
     CONSTRAINT [AK_TheTvDb_EntityId] UNIQUE ([EntityId]), 
     CONSTRAINT [AK_TheTvDb_TheTvDbId] UNIQUE ([TheTvDbId]) 
    ) 

我想要做的是對Shows表指向創建關聯屬性TheTvDbLastUpdatedTheTvDb的財產LastUpdated。連接TheTvDb記錄與Shows記錄的關鍵是EntityId。這種關係是一對一的。我知道如何創建將鏈接到整個TheTvDbTable的關聯,但我不知道如何僅鏈接到這一個屬性,這將使得從生成的實體類訪問它更方便。謝謝。

我使用數據庫優先的方法,所以我正在尋找一種方法來從.edmx文件的設計者做到這一點。

回答

1

這是不可能的。 「指向」某些內容的屬性是引用/導航屬性。您無法將標量/值類型設置爲導航屬性。

方便的幫手可能是一個只讀助手屬性(在局部類文件中實現的,而不是EDMX):

public partial class Show 
{ 
    public long TheTvDbLastUpdated { get { return this.TheTvDb.LastUpdated; } } 
} 

TheTvDb將是一個對一個導航屬性從ShowTheTvDb。如果您使用延遲加載訪問此屬性,則會先加載數據庫中的TheTvDb實體,前提是尚未加載該實體。如果您不使用延遲加載TheTvDb可能是null並且訪問該屬性會導致異常。你可能趕上這種情況下:

public long TheTvDbLastUpdated 
{ 
    get 
    { 
     if (this.TheTvDb == null) 
      throw new InvalidOperationException(
       "TheTvDbLastUpdated cannot be accessed before TheTvDb is loaded."); 
     return this.TheTvDb.LastUpdated; 
    } 
} 

總之,你需要的導航性能,它看起來並不像一個巨大的勝利,如果你寫show.TheTvDbLastUpdated,而不是show.TheTvDb.LastUpdated(實際上勝利只是一個節約單個點)。

+0

感謝您的好回答。 – 2012-07-26 06:45:35

1

有一種替代解決方案 - 您首先使用數據庫,以便您可以簡單地創建一個視圖,它將提供您的投影並映射視圖而不是表格。新實體只會被讀取,因爲EF不知道如何更新隱藏在視圖後面的原始表 - 這種限制可以通過映射存儲過程來插入,更新和刪除功能來解決。

View還可以解決其他問題EF會與你的數據庫

  • 它看起來像你的TheTvDb沒有主鍵 - 無主鍵表是隻讀的,在EF
  • 你正在努力建設一對一關係Shows.IdTheTvDb.EntityId。在你的數據庫中,這種關係是一對一的,因爲你對EntityId有獨特的約束,但是在EF中這個關係將是一對多的,因爲EF不支持唯一的約束條件