2

多くの関係を持つデータベースがあります。残念ながら、これは古い保守データベースであり、関連付けやキーの概念を理解していないようで、欠落している場合があります。主な用途は別のアプリケーションであるため、データベースを変更することはほとんど望んでいません(むしろEntity Frameworkを構成します)

私が抱えている問題は、外部キーを主キーとして使用しようとしていることです.(私は推測します)関連テーブルがそれを使用しています.

私のテーブルは呼び出されます

Operation{    Criteria {    Parameter{    CriteriaSelection {
  ID            ID,           ID,           ID,
  ..            ..            ..            ..
}             }             }             }

CheckpointOperation {
  ID,
  Criteria_ID,
  ..
}

CheckpointParameter {
  // missing primary key
  CheckpointOperation_ID,  // a CheckpointOperation has many CheckpointParameters
  CriteriaSelection_ID,    // a CheckpointParameter has one CriteriaSelection
  Parameter_ID,            // .. and one Parameter
  ..
}

ここでの問題は、CheckpointParameter具体的に定義された主キーではなく、の主キーが定義されていることです{ CheckpointOperation_ID, CriteriaSelection_ID, Parameter_ID }。今、私はそれを EntityFramework でclass CheckpointParameterMap : EntityTypeConfiguration<CheckpointParameter>.

public class CheckpointOperation
{
    public int Id { get; set; }
    public virtual Operation Operation { get; set; }

    public virtual ICollection<CheckpointParameter> Parameters { get; set; }
}

public class CheckpointParameter
{
    public int OperationId { get; set; }

    public virtual CheckpointOperation CheckpointOperation { get; set; }
    public virtual CriteriaSelection Criteria { get; set; }
    public virtual QualityParameter Parameter { get; set; }
}

public class CheckpointParameterMap : EntityTypeConfiguration<CheckpointParameter>
{
    public CheckpointParameterMap()
    {
        HasKey(p => new { p.OperationId });

        Property(p => p.OperationId)
            .HasColumnName("CheckpointOperation_ID");

        HasRequired(p => p.CriteriaSelection)
            .WithRequiredDependent()
            .Map(map => map.MapKey("CriteriaSelection_ID"));

        HasRequired(p => p.Parameter)
            .WithRequiredDependent()
            .Map(map => map.MapKey("Parameter_ID"));

        HasRequired(p => p.CheckpointOperation)
            .WithMany(o => o.CheckpointParameters)
            .HasForeignKey(p => p.OperationId);
    }
}

しかし、これは私にエラーを与えます

関係 'CheckpointParameter_CheckpointOperation' のロール 'CheckpointParameter_CheckpointOperation_Source' で多重度が無効です。依存ロールはキー プロパティを参照するため、依存ロールの多重度の上限は '1' でなければなりません。\r\n"}

だから私は削除しようとしましたHasKeyが、それは私にエラーを与えます

EntityType 'CheckpointParameter' にはキーが定義されていません。この EntityType のキーを定義してください。\r\n\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'CheckpointParameters' は、キーが定義されていないタイプ 'CheckpointParameter' に基づいています.\r\n"}

次に、列名があるため、主キーで外部の CriteriaSelectionId も使用しようとしました。

public class CheckpointParameter
{
    ...
    public int CriteriaSelectionId { get; set; }
    ...
}

public CheckpointParameterMap()
{
    HasKey(p => new { p.OperationId, p.CriteriaSelectionId });
    //...
    Property(checkpointParameter => checkpointParameter.CriteriaSelectionId)
        .HasColumnName("CEC_ID");
}

しかし、これにより次のエラーが発生します。

{"指定されたスキーマは無効です。エラー: \r\n(48,6): エラー 0019: 型の各プロパティ名は一意である必要があります。プロパティ名 'CriteriaSelection_ID' は既に定義されています。"}

データベースを変更せずに、外部キーである主キーを定義する適切な方法は何ですか?

4

1 に答える 1

1

Mapping の Criteria と Operation に、次のような参照になるフィールドを追加する必要があります。

this.HasKey(x => x.OperationId); // In Operation Mapping

this.HasKey(x => x.CriteriaId); // In Criteria Mapping

そして、基準または操作では、次のようにマッピングする必要があります。

this.HasMany(b => b.Criterias)
    .WithMany( x=> x.Operations)
    .Map(x =>
    {
        x.ToTable("CheckpointParameter");
        x.MapLeftKey("CriteriaId");
        x.MapRightKey("OperationId");
    });
于 2013-10-08T14:23:18.013 に答える