10

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

/* 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 出现以下错误:指定为此 MSL 的一部分的列“Id”在 MetaDataWorkspace 中不存在

我有点理解,因为 EF 可能没有看到椅子产品的 PK 发生了变化。(并且仍然假设它被称为“Id”)但我无法弄清楚我如何指示 EF 使用备用键。

谢谢,

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

4

4 回答 4

5

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

要解决这个问题:

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

我有 Visual Studio 2015 udpate 3

于 2016-10-30T19:23:32.787 回答
1

我最近正在寻找类似错误的修复方法,但首先设计的是数据库。我在这里发布我的发现,因为这是我的搜索不断登陆我的地方。

在 build 上有多个类似的错误。他们真正的意思是我的模型从未成功构建

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

我能找到的大多数错误和细节实际上只是红鲱鱼;除了模型没有成功构建的概念;并且了解其他人在数据库中所做的更改会有所帮助。

于 2018-11-19T21:12:10.303 回答
0

发表您的评论作为答案:

添加以下内容:

modelBuilder.Entity<Table>().HasMany(x => x.Chairs).WithMany()
.Map(m => { 
 m.MapLeftKey("TableId"); m.MapRightKey("ChairId"); 
 m.ToTable("TableChairs"); 
});
于 2015-04-09T18:01:35.237 回答
0

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

原来这是一个错误的警告,而clean/rebuild摆脱了错误。花了几个小时试图找出 edmx 文件出了什么问题,但从未想过运行它并检查它是否真的有问题。

于 2019-06-06T05:51:40.267 回答