C# EF6代码第一模型外键

C# EF6代码第一模型外键,c#,entity-framework,database-design,foreign-keys,C#,Entity Framework,Database Design,Foreign Keys,当我试图从下面的模型生成数据库时,我遇到了一个异常 类型的属性“DataCenterBenchmark”上的ForeignKeyAttribute “Benchmark.Data.Context”无效。外键 在依赖类型上找不到名称“BenchmarkId” “Benchmark.Data.Context”。名称值应为 以逗号分隔的外键属性名称列表 [表格(“上下文”)] 公共类上下文 { [关键] 公共Guid内部ID{get;set;} [必需]公共字符串名称{get;set;} [必需]公共

当我试图从下面的模型生成数据库时,我遇到了一个异常

类型的属性“DataCenterBenchmark”上的ForeignKeyAttribute “Benchmark.Data.Context”无效。外键 在依赖类型上找不到名称“BenchmarkId” “Benchmark.Data.Context”。名称值应为 以逗号分隔的外键属性名称列表

[表格(“上下文”)]
公共类上下文
{
[关键]
公共Guid内部ID{get;set;}
[必需]公共字符串名称{get;set;}
[必需]公共字符串群集{get;set;}
[必需]公共字符串标记{get;set;}
[必需]公共字符串IP{get;set;}
[必需]公共字符串备忘录{get;set;}
[必需]公共字符串BenchType{get;set;}
[必需]公共int InstanceCount{get;set;}
[必需]公共int线程计数{get;set;}
[必需]公共int请求计数{get;set;}
[必需]公共日期时间CreationDate{get;set;}
[必需]公共日期时间编辑日期{get;set;}
[ForeignKey(“BenchmarkId”)]
公共基准RemoteBenchmark{get;set;}
[ForeignKey(“BenchmarkId”)]
公共基准数据中心基准{get;set;}
[ForeignKey(“BenchmarkId”)]
公共基准IISBenchmark{get;set;}
[ForeignKey(“BenchmarkId”)]
公共基准LocalBenchmark{get;set;}
[外键(“MachineTypeId”)]
[必需]公共MachineType MachineType{get;set;}
}
[表(“基准”)]
公共课基准
{
[关键]
public int BenchmarkId{get;set;}
[必需]公共字符串结果{get;set;}
[必需]公共日期时间持续时间{get;set;}
}
[表(“机器类型”)]
公共类MachineType
{
[关键]
public int MachineTypeId{get;set;}
[必需]公共字符串名称{get;set;}
}
公共类BenchmarkContext:DbContext
{
公共数据库集上下文{get;set;}
公共数据库集基准{get;set;}
公共DbSet MachineTypes{get;set;}
}
尝试用一些教程来修复它-没有成功

问候,, 马克

======编辑=====

删除[ForeignKey]标志后,我无法连接到我的SQL Server(错误26)。我没有将任何数据库设置为连接字符串,因此EF6需要创建一个localdb。

您可以在
BenchmarkContext
中重写
OnModelCreating
方法,并编写如下表之间的关系

注意:您需要删除属性
[ForeignKey(“BenchmarkId”)]

public类BenchmarkContext:DbContext
{
公共数据库集上下文{get;set;}
公共数据库集基准{get;set;}
公共DbSet MachineTypes{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(m=>m.RemoteBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“RemoteBenchmarkId”);});
modelBuilder.Entity()
.HasRequired(m=>m.DataCenterBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“DataCenterBenchmarkId”);});
modelBuilder.Entity()
.has必需(m=>m.IISBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“IISBenchmarkId”);});
modelBuilder.Entity()
.HasRequired(m=>m.LocalBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“LocalBenchmarkId”);});
}
}
您可以在
BenchmarkContext
中重写
OnModelCreating
方法,并编写如下表之间的关系

注意:您需要删除属性
[ForeignKey(“BenchmarkId”)]

public类BenchmarkContext:DbContext
{
公共数据库集上下文{get;set;}
公共数据库集基准{get;set;}
公共DbSet MachineTypes{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(m=>m.RemoteBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“RemoteBenchmarkId”);});
modelBuilder.Entity()
.HasRequired(m=>m.DataCenterBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“DataCenterBenchmarkId”);});
modelBuilder.Entity()
.has必需(m=>m.IISBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“IISBenchmarkId”);});
modelBuilder.Entity()
.HasRequired(m=>m.LocalBenchmark)
.WithOptional()
.Map(m=>{m.MapKey(“LocalBenchmarkId”);});
}
}

有关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; }
    }
考虑到这一点,您可能需要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推断列本身(默认情况下命名为
\u Id
,例如
RemoteBenchmark\u Id
),但是如果不检索整个基准,您就无法检索Id本身。我想这一切都取决于具体情况;就个人而言,我并不介意将模型与外键属性混在一起,因为有时候键本身就足够了

(至少,
[ForeignKey]
注释不应被删除
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; }
    }
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; }
    }