当我尝试从遵循的模型生成数据库时,出现异常。


  类型的属性“ 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 ..?

最佳答案

通过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),但是如果不检索整个基准,就无法检索ID。猜测一切都取决于具体情况;就个人而言,我不介意带有外键属性的混乱模型,因为有时键本身就足够了。

(至少不需要[ForeignKey]批注;如果缺少批注会导致错误,则可能完全是另一个问题...?)

干杯〜!

关于c# - EF6代码优先模型ForeignKey,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29367616/

10-10 01:31