我有一个有很多关系的数据库。不幸的是,它是一个旧的维护数据库,似乎不理解关联或键的概念,有时它缺乏。它的主要用途是在另一个应用程序中,因此我最不愿意更改数据库(而是配置实体框架)
我遇到的问题是尝试将外键用作主键,因为(我猜)关联表使用它。
我的桌子被称为
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”已定义。”}
在不修改数据库的情况下定义主键(即外键)的正确方法是什么?