EF Code First THE - 在MetaDataWorkspace中不存在指定为此MSL的一部分的列'Id'

时间:2013-09-04 12:52:53

标签: c# ef-code-first table-per-type

我在代码优先项目(EF5)中使用'table-per-type'层次结构。 我的派生类覆盖默认的主键名称,以便从数据库的角度清楚地识别这种关系,如下所示:

/* change primary keys to Chair.ProductId and Table.ProductId */
modelBuilder.Entity<Chair>()
    .Property(x => x.Id)
    .HasColumnName("ProductId");

modelBuilder.Entity<Table>()
    .Property(x => x.Id)
    .HasColumnName("ProductId");

使用以下类作为示例:

[Table("Product")]
public class Product
{
   public int Id {get; set;}

   /* generic product properties */
}

[Table("Chair")]
public class Chair : Product
{
     /* specific chair properties */
}

[Table("Table")]
public class Table : Product
{
     public virtual ICollection<Chair> Chairs {get; set;}

     /* specific table properties */
}

导致属性Table.Chairs上的以下错误:在MetaDataWorkspace中不存在指定为此MSL的一部分的列'Id'

我有点理解,因为EF可能没有看到主席产品的PK被改变了......(并且仍假设它被称为'Id')但我无法弄清楚我如何指示EF使用备用密钥

THX,

PS。是的我知道,如果我不更改PK的名称,它可以工作......但可以使用EF Fluent API完成吗?

4 个答案:

答案 0 :(得分:4)

这是Visual Studio中EDMX模型生成器的一些错误。

解决这个问题:

  • 从EF中删除特定表格。
  • 保存EF并重新启动Visual Studio
  • 再次将特定表添加到模型
  • 保存并编译

我有Visual Studio 2015 udpate 3

答案 1 :(得分:1)

我最近正在寻找解决类似错误的方法,但首先要设计数据库数据库。我将搜索结果发布在这里,因为这是我不断搜寻的地方。

我在构建时遇到了多个类似的错误。他们真正的意思是我的模型从未成功构建

我能够通过删除并重新添加一些最近在数据库中修改过的表值函数来解决此问题。

我可以找到的大多数错误和详细信息实际上只是红鲱鱼;除了模型无法成功构建的概念之外;并且了解数据库中其他人正在更改的内容。

答案 2 :(得分:0)

发表评论作为答案:

添加以下内容:

modelBuilder.Entity<Table>().HasMany(x => x.Chairs).WithMany()
.Map(m => { 
 m.MapLeftKey("TableId"); m.MapRightKey("ChairId"); 
 m.ToTable("TableChairs"); 
});

答案 3 :(得分:0)

我遇到类似的错误,并对edmx文件进行了一些手动修复,但Visual Studio仍在报告此警告。

原来这是一个错误的警告,清理/重建摆脱了该错误。花了数小时试图找出edmx文件出了什么问题,但从未想到过运行它并检查它是否确实是一个问题。