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

标签 c# entity-framework database-design foreign-keys

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

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/

相关文章:

entity-framework - 如何向 CaSTLe Windsor 注册 Ef core db 上下文?

linq - 在 Entity Framework 中的运算符中实现

postgresql - 模拟多对多关系的最佳方式是什么

mysql - 我应该如何构建一个数据库/构建一个查询,用它按 friend 'interacting' 的数量对帖子进行排序

c# - 如果小数部分为零,如何删除小数点分隔符?

c# - 使用自定义符号执行 Roslyn 条件编译(例如 : "DEBUG") defined

c# - 如何从纬度和经度获得最近的重要人口中心?

c# - 带有计时器的 Xamarin Android UI 没有对更改使用react

c# - EF6 配置必需到可选的关系(一对 - 零或一

php - 聊天应用程序的数据库设计