2015-03-31 92 views
1

我得到了一個例外,當我試圖從後面的模型生成數據庫。EF6代碼第一個模型ForeignKey

'Benchmark.Data.Context'屬性'DataCenterBenchmark'上的ForeignKeyAttribute無效。在依賴類型 'Benchmark.Data.Context'上找不到名稱'BenchmarkId'的外鍵 。名稱值應該是 逗號分隔的外鍵屬性名稱列表。

[Table("Contexts")] 
public class Context 
{ 
    [Key] 
    public Guid InternalId { get; set; } 

    [Required] public string Name { get; set; } 
    [Required] public string Cluster { get; set; } 
    [Required] public string Token { get; set; } 
    [Required] public string IP { get; set; } 
    [Required] public string Memo { get; set; } 
    [Required] public string BenchType { get; set; } 

    [Required] public int InstanceCount { get; set; } 
    [Required] public int ThreadCount { get; set; } 
    [Required] public int RequestCount { get; set; } 

    [Required] public DateTime CreationDate { get; set; } 
    [Required] public DateTime EditDate { get; set; } 

    [ForeignKey("BenchmarkId")] 
    public Benchmark RemoteBenchmark { get; set; } 
    [ForeignKey("BenchmarkId")] 
    public Benchmark DataCenterBenchmark { get; set; } 
    [ForeignKey("BenchmarkId")] 
    public Benchmark IISBenchmark { get; set; } 
    [ForeignKey("BenchmarkId")] 
    public Benchmark LocalBenchmark { get; set; } 

    [ForeignKey("MachineTypeId")] 
    [Required] public MachineType MachineType { get; set; } 
} 

[Table("Benchmarks")] 
public class Benchmark 
{ 
    [Key] 
    public int BenchmarkId { get; set; } 
    [Required] public string Result { get; set; } 
    [Required] public DateTime Duration { get; set; } 
} 

[Table("MachineTypes")] 
public class MachineType 
{ 
    [Key] 
    public int MachineTypeId { get; set; } 
    [Required] public string Name { get; set; } 
} 

public class BenchmarkContext : DbContext 
{ 
    public DbSet<Context> Contexts { get; set; } 
    public DbSet<Benchmark> Benchmarks { get; set; } 
    public DbSet<MachineType> MachineTypes { get; set; } 
} 

嘗試與一些教程修復它 - 沒有勝利...

問候, 馬克

=====編輯=====

取出後[ForeignKey]標誌我無法連接到我的SQL Server(錯誤26)。我沒有設置數據庫作爲連接字符串,所以EF6需要創建一個localdb ..?

+0

爲什麼多個'[ForeignKey(「BenchmarkId」)]'在不同的導航屬性上?你想達到什麼目的?你認爲'[ForeignKey]'屬性是爲了什麼? – haim770 2015-03-31 11:35:26

+0

我需要4個基準測試集。有更好的方法嗎? – Marc 2015-03-31 11:37:34

+1

嘗試首先刪除所有'[ForeignKey]'屬性。看看你有什麼,然後重新描述你的問題。 – haim770 2015-03-31 11:39:46

回答

1

通過ForeignKey屬性的快速指南。

在關鍵屬性(如int RemoteBenchmarkId)上使用時,其名稱應該指向導航屬性(例如Benchmark RemoteBenchmark)。 在導航屬性(此時爲Benchmark RemoteBenchmark)上使用時,其名稱應指向關鍵屬性(如int RemoteBenchmarkId)。

下面的代碼片段是等價的:

public class Context { 
    //...other properties 

    [ForeignKey("RemoteBenchmark")] 
    public int RemoteBenchmarkId { get; set; } 
    public Benchmark RemoteBenchmark { get; set; } 
    } 
public class Context { 
    //...other properties 

    public int RemoteBenchmarkId { get; set; } 

    [ForeignKey("RemoteBenchmarkId")] 
    public Benchmark RemoteBenchmark { get; set; } 
    } 

考慮到這一點,你可能想要的是4個基準,每個都具有自己的外鍵列(使用相同的密鑰的兩個基準性能會指向相同的實例,這可能不是您想要的),如下所示:

public class Context { 
    //...other properties 

    [ForeignKey("RemoteBenchmark")] 
    public int RemoteBenchmarkId { get; set; } 
    public Benchmark RemoteBenchmark { get; set; } 

    [ForeignKey("DataCenterBenchmark")] 
    public int DataCenterBenchmarkId { get; set; } 
    public Benchmark DataCenterBenchmark { get; set; } 

    [ForeignKey("IISBenchmark")] 
    public int IISBenchmarkId { get; set; } 
    public Benchmark IISBenchmark { get; set; } 

    [ForeignKey("LocalBenchmark")] 
    public int LocalBenchmarkId { get; set; } 
    public Benchmark LocalBenchmark { get; set; } 
    } 

不要忘記使用[Required]註釋如果上下文需要特定的基準!

此外,您可能跳過[ForeignKey]註釋完全允許EF推斷本身列(名爲<navigation property name>_Id默認情況下,如RemoteBenchmark_Id),但你不能沒有獲取整個基準檢索IDS本身。猜猜這一切都取決於具體情況;個人而言,我並不介意使用外鍵屬性混淆模型,因爲有時鍵本身就足夠了。

(至少[ForeignKey]註釋不應該是必要的;如果他們缺乏導致的錯誤,這可能完全是另外一個問題......?)

乾杯〜!

1

你可以覆蓋OnModelCreating方法裏面BenchmarkContext並寫下表之間的關係如下。

備註:您需要刪除屬性[ForeignKey("BenchmarkId")]

public class BenchmarkContext : DbContext 
{ 
    public DbSet<Context> Contexts { get; set; } 
    public DbSet<Benchmark> Benchmarks { get; set; } 
    public DbSet<MachineType> MachineTypes { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Context>() 
      .HasRequired(m => m.RemoteBenchmark) 
      .WithOptional() 
      .Map(m => { m.MapKey("RemoteBenchmarkId"); }); 

     modelBuilder.Entity<Context>() 
      .HasRequired(m => m.DataCenterBenchmark) 
      .WithOptional() 
      .Map(m => { m.MapKey("DataCenterBenchmarkId"); }); 

     modelBuilder.Entity<Context>() 
      .HasRequired(m => m.IISBenchmark) 
      .WithOptional() 
      .Map(m => { m.MapKey("IISBenchmarkId"); }); 

     modelBuilder.Entity<Context>() 
      .HasRequired(m => m.LocalBenchmark) 
      .WithOptional() 
      .Map(m => { m.MapKey("LocalBenchmarkId"); }); 
    } 
} 
相關問題