gpt4 book ai didi

c# - EF6 代码第一个模型 ForeignKey

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:02 25 4
gpt4 key购买 nike

当我尝试从后续模型生成数据库时出现异常。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com