当我尝试从遵循的模型生成数据库时,出现异常。
类型的属性“ 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/