32

我正在尝试对具有父子关系的 2 个对象使用复合主键。每当我尝试创建新迁移时,都会出现错误:

无法确定类型“Models.UserProjectRole”的复合主键排序。使用 ColumnAttribute 或 HasKey 方法指定复合主键的顺序。

根据错误提示,我确实添加了注释Column (Order = X),但错误仍然存​​在并且不会消失,除非我只留下一个带有 Key 注释的字段。这是我绊倒的对象:

public class UserProjectRole
{
    [Key, Column(Order = 0),DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserProjectRoleID { get; set; }

    [Key, Column (Order = 1)]
    public Guid ProjectID { get; set; }

    [ForeignKey("ProjectID")]
    public Project Project { get; set; }

    public Guid AppUserGuid { get; set; }

    // followed by a number of unrelated String fields.
 }

这是项目类:

public class Project: Base
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProjectID { get; set; }

    public virtual ICollection<UserProjectRole> UserRoles { get; set; }

    // followed by a number of unrelated String fields.

}

这是我的 DBContext 的一部分:

public class SiteContext : DbContext
{

    public DbSet<Project> Projects { get; set; }

    public DbSet<UserProjectRole> UserProjectRoles { get; set; }
}

我在使用 EF 4.3.1 的 VisualStudio 2012

一段时间以来,我一直在努力反对这一点,所有论坛和 SO 答案都建议添加我已经拥有的列顺序注释。 我错过了一些明显的东西吗???

谢谢你读到这里-)

4

4 回答 4

16

它花了很多时间摆弄和测试不同的东西。直到我决定从头开始使用类似的数据结构制作一个新的香草项目之前,我一无所知。当我从 NuGet 安装 EntityFramework 时,我看到了一条消息:

Entity Framework 4.x 和 .NET Framework 4.5 的已知问题

Entity Framework 4.1 到 4.3 在 EntityFramework 程序集中的 System.ComponentModel.DataAnnotations 命名空间中包含了额外的数据注释。在 .NET 4.5 中,这些注释被移动到 System.ComponentModel.DataAnnotations.dll 程序集的 System.ComponentModel.DataAnnotations.Schema 命名空间中成为 .NET Framework 的一部分。如果您使用的是 EF 4.x 并以 .NET 4.5 为目标,则会导致在不同程序集中具有相同名称的两个数据注释。因为 .NET Framework 中的注释位于不同的命名空间中,所以我们无法使用类型转发来避免这种冲突。

可以在 .NET 4.5 上使用 EF 4.x,但我们建议使用 EF 5 的最新预发布版本。如果您不使用受影响的数据注释,则不会影响您的代码。如果您在 C# 项目中使用数据注释,则可以使用 extern 修饰符来确保您的代码使用来自 EntityFramework.dll ( http://msdn.microsoft.com/en-us/library/e59b22c5(v=VS ) 的注释.80).aspx )。如果您在 .NET 4.5 中使用 System.ComponentModel.DataAnnotations.dll 程序集中的新注释,Code First 将不会处理它们。

受影响的注释是:

  • 柱子
  • 复杂类型
  • 数据库生成
  • 数据库生成选项
  • 外键
  • 逆属性
  • 最长长度
  • 最小长度
  • 未映射
  • 桌子

那时我意识到我的数据项目是在 VS2012 中新创建的,默认情况下以 .Net 4.5 为目标,而我在解决方案中的其余项目是从 VS2010 迁移并以 .Net 4.0 为目标。所以我已经更新了所有项目以 .Net 4.5 为目标,并获得了 EntityFramework 5.0 的预发布版本。

确保您首先将您的项目更新到 Net4.5,然后再将 EF 更新到 5.0,否则它将永远恨你,许多兔子会死去。

此截屏视频是更新到 EF5.0 的绝佳起点

那时我的错误消失了,但我得到了不同的错误。我无法添加迁移,因为它找不到迁移配置,即使我在它之前几秒钟就设置了配置。这又花了很多时间摆弄 NuGet,卸载广告重新安装包。然后我在 packages.config 中看到这样的行:

package id="EntityFramework" version="5.0.0-rc" targetFramework="net40" 

我已将 targetFramework 更改为“net45”,现在我从迁移中获得了预期的行为。我想会有更好的方法来获得带有包的 nuget target .Net 4.5,但这对我有用。

我希望这可以避免有人把头撞到墙上。

于 2012-08-11T11:46:07.750 回答
10
public class UserProjectRole
{
   [Key, Column (Order = 0)]
   public Guid UserProjectRoleID { get; set; }

   [Key, Column (Order = 1)]
   [ForeignKey("Project")]
   public Guid ProjectID { get; set; }

   [Required]
   public Project Project { get; set; }

   public Guid AppUserGuid { get; set; }

   // followed by a number of unrelated String fields.
}

public class Project: Base
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProjectID { get; set; }

    public virtual ICollection<UserProjectRole> UserRoles { get; set; }

    // followed by a number of unrelated String fields.

}

public class SiteContext : DbContext
{
    public DbSet<Project> Projects { get; set; }

    public DbSet<UserProjectRole> UserProjectRoles { get; set; }
}

试试这个,尤其是[Required]上面的public Project Project {get; set;}.

如果这不起作用,请再试一次并删除[Key, Column (Order = 1)]上面的[ForeignKey("ProjectID")]

于 2015-09-22T08:57:54.793 回答
6

这是针对那些死兔子的修复程序(在更新到 .Net 4.5 之前已更新到 EF 5.0):

在 csproj 文件中,更改

<Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
</Reference>

<Reference Include="EntityFramework">
  <HintPath>..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>

当你知道它时很明显......

于 2012-10-10T16:49:53.080 回答
2

我能够使用相同的解决方案

PM> Install-Package EntityFramework -Pre

http://weblogs.asp.net/scottgu/archive/2012/12/11/entity-framework-6-alpha2-now-available.aspx

于 2013-01-12T14:42:02.267 回答