我有一個有很多關係的數據庫。不幸的是,它是一箇舊的維護數據庫,似乎並不瞭解關聯或密鑰的概念,有時它缺少這個概念。它的主要用途是在另一個應用程序,因此我最不願改變數據庫(而是配置實體框架)使用外鍵作爲主鍵
我的問題是試圖使用外鍵作爲主鍵,因爲(我猜)關聯表用它。
我的表稱爲
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);
}
}
但是這給了我一個錯誤的
Multiplicity is not valid in Role 'CheckpointParameter_CheckpointOperation_Source' in relationship 'CheckpointParameter_CheckpointOperation'. Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be '1'.\r\n"}
所以我試圖刪除HasKey
,但給我的
EntityType 'CheckpointParameter' has no key defined. Define the key for this EntityType.\r\n\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'CheckpointParameters' is based on type 'CheckpointParameter' that has no keys defined.\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");
}
但是這給了我以下錯誤:
{"Schema specified is not valid. Errors: \r\n(48,6) : error 0019: Each property name in a type must be unique. Property name 'CriteriaSelection_ID' was already defined."}
什麼是定義主鍵的正確方法,這是外鍵,而無需修改數據庫?
你有運行在生產數據的副本中對這些列執行不同的查詢?這聽起來像你有信心,這些鍵的組合形成了表的一個自然的關鍵。如果確實如此,那麼繼續在這些列上創建一個SQL主鍵。 –
我確實有一份生產數據,是的。我有權訪問定義了表的Oracle數據庫,其中包含以下內容(對於我來說,驗證這是關鍵):CREATE UNIQUE INDEX「X」。「I $ CEPOQ $ UNIQUE」ON「X」。「 CEPOQ「(」CEC_ID「,」CEPO_ID「,」Q_ID「,」FRQ「)',其中cec是標準,cepo是Ch.Operation並且q是參數。請糾正我,如果我錯了 – Default
在這個答案http://stackoverflow.com/a/15704189/2516770它聲明,Oracle不考慮一個唯一的索引也是一個唯一的約束或關鍵約束。發佈第一條錯誤消息時,我猜測創建一個唯一的鍵約束將告訴Oracle EF提供者它正在處理(1:n)關係的一側的不同值。雖然這只是一個猜測。 –