1

次の定義を持つ 2 つのテーブルがあります。

    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])
    )

私がやりたいことはTheTvDbLastUpdated、 table のプロパティをShows指すテーブルに関連付けプロパティを作成することです。レコードとレコードをリンクするキーはです。関係は 1 対 1 です。全体にリンクする関連付けを作成する方法は知っていますが、この 1 つのプロパティのみにリンクする方法がわかりません。これにより、生成されたエンティティ クラスからより便利にアクセスできるようになります。ありがとう。LastUpdatedTheTvDbTheTvDbShowsEntityIdTheTvDbTable

私はデータベース ファーストのアプローチを使用しているので、.edmx ファイルのデザイナーからそれを行う方法を探しています。

4

2 に答える 2

1

それは可能ではありません。何かを「指す」プロパティは、参照/ナビゲーション プロパティです。スカラー/値型をナビゲーション プロパティにすることはできません。

便利なヘルパーは、読み取り専用のヘルパー プロパティです (EDMX ではなく、部分的なクラス ファイルで実装されます)。

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

からへTheTvDbの 1 対 1 のナビゲーション プロパティはどこになりますか。遅延読み込みを使用する場合、このプロパティにアクセスすると、エンティティがまだ読み込まれていない場合、最初にデータベースからエンティティが読み込まれます。遅延読み込みを使用しないと、プロパティにアクセスすると例外が発生する可能性があります。あなたはこのケースをキャッチするかもしれません:ShowTheTvDbTheTvDbTheTvDbnull

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(実際には、勝利は 1 つのドットを節約するだけです)。

于 2012-07-25T22:02:06.363 に答える
1

別の解決策があります-最初にデータベースを使用しているため、テーブルの代わりに投影を提供し、ビューをマップするビューを簡単に作成できます。EF はビューの背後にある元のテーブルを更新する方法を知らないため、新しいエンティティは読み取り専用になります。この制限は、ストアド プロシージャを挿入、更新、および削除機能にマッピングすることで解決できます。

View は、EF がデータベースで抱える他の問題も解決できます。

  • TheTvDb主キーがないようです-主キーのないテーブルはEFで読み取り専用です
  • Shows.Idと の間に1 対 1 の関係を構築しようとしていTheTvDb.EntityIdます。データベースでは、一意の制約があるため、関係は 1 対 1 ですEntityIdが、EF では、EF は一意の制約をまだサポートしていないため、この関係は 1 対多になります。
于 2012-07-26T07:59:26.737 に答える