多くの関係を持つデータベースがあります。残念ながら、これは古い保守データベースであり、関連付けやキーの概念を理解していないようで、欠落している場合があります。主な用途は別のアプリケーションであるため、データベースを変更することはほとんど望んでいません(むしろ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' は既に定義されています。"}
データベースを変更せずに、外部キーである主キーを定義する適切な方法は何ですか?