1

Entity Framework v5は見栄えがよく、既存のMSSQL(Azure)データベースを使用してLinqからSQLに切り替えようとしています。しかし、EFに関するチュートリアルは複雑すぎて従うことができません。

データベーススキーマは次のように非常に単純です(exist dbによって生成されます)。

SheetsテーブルとSheetDetailsテーブルは、1対多の関係で接続されています。

CREATE TABLE [dbo].[Sheets] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Grade]       FLOAT (53)     CONSTRAINT [DF_Sheets_Grade] DEFAULT ((0)) NOT NULL,
    [Title]       NVARCHAR (255) CONSTRAINT [DF_Sheets_Title] DEFAULT ('') NOT NULL,
    [Description] NVARCHAR (255) NULL,
    [Difficulty]  SMALLINT       CONSTRAINT [DF_Sheets_Difficulty] DEFAULT ((0)) NOT NULL,
    [Writer]      NVARCHAR (255) CONSTRAINT [DF_Sheets_Writer] DEFAULT ('') NOT NULL,
    [Tag]         NVARCHAR (255) NULL,
    [Duration]    FLOAT (53)     CONSTRAINT [DF_Sheets_Duration] DEFAULT ((0)) NOT NULL,
    [Timestamp]   DATETIME       CONSTRAINT [DF_Sheets_Timestamp] DEFAULT ((0)) NOT NULL,
    [RowVersion]  ROWVERSION     NOT NULL,
    CONSTRAINT [PK_Sheets] PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[SheetDetails] (
    [Id]                   INT        IDENTITY (1, 1) NOT NULL,
    [Score]                FLOAT (53) CONSTRAINT [DF_SheetDetails_Score] DEFAULT ((0)) NOT NULL,
    [Number]               SMALLINT   CONSTRAINT [DF_SheetDetails_Number] DEFAULT ((0)) NOT NULL,
    [SubNumer]             SMALLINT   NULL,
    [IsRandom]             BIT        CONSTRAINT [DF_SheetDetails_IsRandom] DEFAULT ((0)) NOT NULL,
    [AnswerType]           SMALLINT   CONSTRAINT [DF_SheetDetails_AnswerType] DEFAULT ((0)) NOT NULL,
    [RowVersion]           ROWVERSION NOT NULL,
    [SheetDetail_Sheet]    INT        CONSTRAINT [DF_SheetDetails_SheetDetail_Sheet] DEFAULT ((0)) NOT NULL,
    [SheetDetail_Question] INT        CONSTRAINT [DF_SheetDetails_SheetDetail_Question] DEFAULT ((0)) NOT NULL,
    CONSTRAINT [SheetDetail_Sheet] FOREIGN KEY ([SheetDetail_Sheet]) REFERENCES [dbo].[Sheets] ([Id]) ON DELETE CASCADE
);

SheetDetailsテーブルのFK名はSheetDetail_Sheetであることに注意してください。

結果図は以下の通りです。 ここに画像の説明を入力してください

次に、EntityTypeConfigurationを作成する必要があるかもしれません。質問1として試してみました。

質問1. モデル作成構成を次のように作成しましたが、うまくいきませんでした。違いますか?この単純なデータベースモデルで正しい構成を作成する方法を知るのは難しいです。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new SheetsConfiguration());
        base.OnModelCreating(modelBuilder);
    }

    public class SheetsConfiguration : EntityTypeConfiguration<Sheets>
    {
        public SheetsConfiguration()
            : base()
        {
            HasKey(p => p.Id);
            Property(p => p.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            Property(p => p.RowVersion).IsConcurrencyToken().IsRowVersion();
            HasOptional(p => p.SheetDetails).WithMany().Map(x => x.MapKey("SheetDetail_Sheet"));
            ToTable("Sheets");
        }
    }

を使用して簡単なクエリを実行します

var result = _db.Sheets.Where(sheet => sheet.Id == id).ToList();

次に、次のようにクエリを実行すると、「無効な列名SheetDetail_Sheet」というエラーが発生しました。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Grade] AS [Grade], 
[Extent1].[Title] AS [Title], 
[Extent1].[Description] AS [Description], 
[Extent1].[Difficulty] AS [Difficulty], 
[Extent1].[Writer] AS [Writer], 
[Extent1].[Tag] AS [Tag], 
[Extent1].[Duration] AS [Duration], 
[Extent1].[Timestamp] AS [Timestamp], 
[Extent1].[RowVersion] AS [RowVersion], 
[Extent1].[SheetDetail_Sheet] AS [SheetDetail_Sheet]
FROM [dbo].[Sheets] AS [Extent1]
WHERE [Extent1].[Id] = @p__linq__0

SheetDetail_Sheetは単なるFKであり、edmxプロパティとデータベース列には存在しないため、理解できます。どうすれば修正できますか?

自動生成されたモデルファイルは上書きされる可能性があるため、編集したくありません。多分それはEntityTypeConfigurationで達成されるようです。

質問2. 一般的に使用されるマスター/詳細データベースモデルに関する有用で軽量なリファレンスはありますか?

既存のデータベースから始めるのに苦労しています。stackoverflow、asp.net、ブログなど...多くのチュートリアルがありますが、私の場合のような例を見つけるのは困難です。

ありがとうございました。

4

1 に答える 1

1

Model First を使用してデータベース モデルを作成することをお勧めします (最初にデータベースを使用していますが)。データベース モデルを取得するための優れた記事は、ここにあります。MVC の内容は無視して、POCO クラスを生成する EF5 を使用しているため、「厳密に型指定されたエンティティ クラスの生成」で停止します。Edmx はすべての FK とプロパティを処理する必要があり、コンフィギュレーターについて心配する必要はありません。

于 2012-10-24T15:07:53.930 に答える