4

SO でこの例外を取り巻く既存の質問に目を通しましたが、私の状況には当てはまらないようです。

ReferentialConstraint の依存プロパティは、ストアで生成された列にマップされます。列: 'SchemaDictionaryId'。

Update-Databaseパッケージ マネージャー コンソールで実行すると、この例外が発生します。

私のシードメソッドは次のとおりです。

protected override void Seed(DataEntry.App_Data.DataEntryDataContext context)
{
    context.Schemas.AddOrUpdate(s => s.SchemaId, _generateSchemaData());
    context.SaveChanges();
}

private Schema[] _generateSchemaData()
{
    List<Schema> schemas = new List<Schema>();
    // Loop removed for simplicity
    schemas.Add(new Schema
    {
        // various property assignments
        SchemaDictionary = new SchemaDictionary
        {
            // various property assignments
        }
    });
    return schemas.ToArray();
}

私の DbContext サブクラスには、次の流暢な API 定義が含まれています (関連性のためにトリミングされています)。

modelBuilder.Entity<Schema>()
    .HasKey(s => s.SchemaId);

modelBuilder.Entity<Schema>()
    .Property(s => s.SchemaId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    .IsRequired();

modelBuilder.Entity<SchemaDictionary>()
    .HasKey(sd => sd.SchemaDictionaryId);

modelBuilder.Entity<SchemaDictionary>()
    .Property(s => s.SchemaDictionaryId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
    .IsRequired();

modelBuilder.Entity<SchemaDictionary>()
    .HasRequired(sd => sd.Schema)
    .WithOptional(s => s.SchemaDictionary);

そして最後に、問題の POCO:

public class Schema
{
    public Guid SchemaId { get; set; }

    public Nullable<Guid> SchemaDictionaryId { get; set; }
    public virtual SchemaDictionary SchemaDictionary { get; set; }

    // various other properties
}

public class SchemaDictionary
{
    public Guid SchemaDictionaryId { get; set; }

    public Nullable<Guid> SchemaId { get; set; }
    public virtual Schema Schema { get; set; }

   // various other properties
}

と の間の関係はSchema1 対 0 または 1SchemaDictionaryのタイプであることを意図しています...

  • Schemaオブジェクトは 0 または 1 になりますSchemaDictionary
  • SchemaDictionaryには常に単一の がありSchemaます。

問題についての私の理解は、EF がGUID外部キーを認識していないため、FK 制約を維持できないということです。このような依存関係が定義されている場合、シード データを挿入するにはどうすればよいですか?

4

1 に答える 1

8

これを行う場合:

modelBuilder.Entity<SchemaDictionary>()
    .HasRequired(sd => sd.Schema)
    .WithOptional(s => s.SchemaDictionary);

必須対オプションの関係 (1 対 0 または 1) を構成しています。SchemaDictionaryが従属であり、Schemaがプリンシパルであることを指定しています

Entity Framework に 1 対 1 の関係がある場合、従属の PK はプリンシパルの FK である必要もあります。しかし、データベースで生成する必要があると指定しました。列を FK と IDENTITY の両方にすることはできないため、エラー メッセージが表示されます。プロパティHasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)からを削除する必要がありますSchemaDictionaryId

余談ですが、コードの一部は不要です

  1. HasKeyEFは命名規則によってキーであるSchemaIdと仮定するためSchemaDictionaryID

  2. IsRequired()null 許容ではないフィールド

参考文献:

マッピングするとき、どちらがプリンシパルですか?

プリンシパル エンドとはどういう意味ですか?

于 2013-11-05T16:56:05.230 に答える