3

次のようなクラス階層があります。

class BaseType
{
  [Key]
  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
  public int Id { get; set; }

  [DataType(DataType.Text)]
  [StringLength(100)]
  public string CreatedBy { get; set; }

  [DataType(DataType.DateTime)]
  public DateTime? CreatedDate { get; set; }
....
}

class Group : BaseType
{
  public string Name { get; set; }
}

コンテキストのOnModelCreatingメソッドは次のとおりです。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MCQGroup>()
        .HasKey(t0 => t0.Id)
        .Map(m => m.ToTable("groups"))
        .HasMany(t1 => t1.Sections)
        .WithMany(t2 => t2.Groups)
        .Map(m =>
          m.MapLeftKey("group_id")
          .MapRightKey("section_id")
          .ToTable("groups_to_sections"));
  ...........
  }

テーブルの自動生成または移行を使用していません。代わりに、データベースを作成するためのスクリプトがいくつかあります(実際、最初の実行には自動生成を使用し、その後、スクリプトで作成されたテーブルにはwebdata_ *テーブルが含まれています)。これは、使用される複数のコンテキストが原因で発生します。この場合、テーブルの自動生成に多くの問題があります。

SQLスクリプトは次のとおりです。

-- Tables creation

CREATE TABLE [groups]
(
    [id]           INT NOT NULL IDENTITY(1, 1),
    [name]         NVARCHAR(300) NOT NULL,
    [createdby]    NVARCHAR(4000) NULL,
    [createddate]  DATETIME NULL,
    [modifiedby]   NVARCHAR(4000) NULL,
    [modifieddate] DATETIME NULL
);

GO
......
-- Intitial data population

SET IDENTITY_INSERT [user_profiles] ON;
GO
INSERT INTO [user_profiles] ...........

SET IDENTITY_INSERT [user_profiles] OFF;
GO

INSERT INTO [webpages_Membership] .............
GO

SET IDENTITY_INSERT [webpages_Roles] ON;
GO

INSERT INTO [webpages_Roles] ..............
GO
SET IDENTITY_INSERT [webpages_Roles] OFF;
GO

INSERT INTO [webpages_UsersInRoles] ...........
GO

注0:EdmMetadataなどのテーブルはありません(起動時に作成されていないため、スクリプトを作成していません)。私はEFの第一人者ではなく、Code Firstのアプローチにはメタデータは必要ないと思います(私は正しいですか?)。

注1:もちろん、作成されたコンテキストに必要な他のすべてのクラス/テーブル=)

注2:データの入力中にIDENTITYで何か問題が発生した可能性がありますか?IDENTITYに触れるすべての文字列はここにあります。

問題:グループを保存しようとすると、「ID'id'のメンバーがメタデータコレクションに存在しません。パラメーター名:identity」という例外が発生します。修正方法を教えてください。

4

1 に答える 1

5

見つけた!解決策は単純でした。属性ウェイのメタデータ宣言とfluent-api-wayを混在させないでください。 削除しました

  [Key]
  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

Id宣言から、OnModelChangingのすべてのモデル宣言を次のように変更しました。

modelBuilder.Entity<MCQGroup>()
    .HasKey(t0 => t0.Id)
    .Map(m => m.ToTable("groups"))
    .Property(x => x.Id)
    .HasColumnName("id")
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    .IsRequired();
modelBuilder.Entity<MCQGroup>()
    .HasMany(t1 => t1.Sections)
    .WithMany(t2 => t2.Groups)
    .Map(m => m.MapLeftKey("group_id").MapRightKey("section_id").ToTable("groups_to_sections"));
于 2012-12-26T06:05:42.870 に答える