C# EF6代码第一模型外键
当我试图从下面的模型生成数据库时,我遇到了一个异常 类型的属性“DataCenterBenchmark”上的ForeignKeyAttribute “Benchmark.Data.Context”无效。外键 在依赖类型上找不到名称“BenchmarkId” “Benchmark.Data.Context”。名称值应为 以逗号分隔的外键属性名称列表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;} [必需]公共
[表格(“上下文”)]
公共类上下文
{
[关键]
公共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; }
}