2015-03-31 64 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"); }); 
    } 
} 
相关问题