当我尝试从后续模型生成数据库时出现异常。
The ForeignKeyAttribute on property 'DataCenterBenchmark' on type 'Benchmark.Data.Context' is not valid. The foreign key name 'BenchmarkId' was not found on the dependent type 'Benchmark.Data.Context'. The Name value should be a comma separated list of foreign key property names.
[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..?
最佳答案
外键属性快速指南。
当用于关键属性(例如 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/