2

我有一個有很多關係的數據庫。不幸的是,它是一箇舊的維護數據庫,似乎並不瞭解關聯或密鑰的概念,有時它缺少這個概念。它的主要用途是在另一個應用程序,因此我最不願改變數據庫(而是配置實體框架)使用外鍵作爲主鍵

我的問題是試圖使用外鍵作爲主鍵,因爲(我猜)關聯表用它。

我的表稱爲

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."}

什麼是定義主鍵的正確方法,這是外鍵,而無需修改數據庫?

+0

你有運行在生產數據的副本中對這些列執行不同的查詢?這聽起來像你有信心,這些鍵的組合形成了表的一個自然的關鍵。如果確實如此,那麼繼續在這些列上創建一個SQL主鍵。 –

+0

我確實有一份生產數據,是的。我有權訪問定義了表的Oracle數據庫,其中包含以下內容(對於我來說,驗證這是關鍵):CREATE UNIQUE INDEX「X」。「I $ CEPOQ $ UNIQUE」ON「X」。「 CEPOQ「(」CEC_ID「,」CEPO_ID「,」Q_ID「,」FRQ「)',其中cec是標準,cepo是Ch.Operation並且q是參數。請糾正我,如果我錯了 – Default

+0

在這個答案http://stackoverflow.com/a/15704189/2516770它聲明,Oracle不考慮一個唯一的索引也是一個唯一的約束或關鍵約束。發佈第一條錯誤消息時,我猜測創建一個唯一的鍵約束將告訴Oracle EF提供者它正在處理(1:n)關係的一側的不同值。雖然這只是一個猜測。 –

回答

1

您需要映射的標準和操作添加哪些領域會是這樣的參考:

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"); 
    }); 
+0

嗯..但他們沒有很多,是嗎?我的意思是,一個'CheckpointOperation'有很多CheckpointParameters。一個'CheckpointParameter'具有**一個**'CriteriaSelection'和**一個**'參數'的知識。你能解釋爲什麼我應該用'WithMany'? – Default

+0

你能用類圖解釋模型嗎? – Santin

+0

我做了一些進一步的調試,看來我確實需要按照你的建議使用'WithMany'。我還注意到,使用'HasForeignKey'比'Map'工作得更好,因爲(我猜)它不必加載其他列,而只是外鍵id屬性。 – Default