Используйте ColumnAttribute или haskey метод, чтобы указать порядок для составных первичных ключей

Я пытаюсь использовать составной первичный ключ на 2 объектах с отношениями родитель-потомок. Всякий раз, когда я пытаюсь создать новую миграцию, я получаю сообщение об ошибке:

невозможно определить составное упорядочение первичного ключа для моделей типа.UserProjectRole'. Используйте ColumnAttribute или haskey метод, чтобы указать порядок для составных первичных ключей.

согласно ошибке, я добавляю аннотацию Column (Order = X) но ошибка все еще там и не уходит, если я не уйду только одно поле с ключевой аннотацией. Вот мой объект, который он отключает:

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; }
}

Я в VisualStudio 2012 с EF 4.3.1

Я уже некоторое время бьюсь головой об это, и весь форум, и поэтому ответы предлагают добавить аннотацию порядка столбцов, которая у меня уже есть. я упускаю что-то очевидное???

спасибо ты за чтение это далеко -)

4 ответов


потребовалось много возиться и тестировать разные вещи. Я был невежествен, пока не решил сделать новый проект vanilla с аналогичной структурой данных с нуля. И когда я установил EntityFramework из NuGet, мне было показано сообщение:

известные проблемы с Entity Framework 4.x и .NET Framework 4.5

Entity Framework 4.1 - 4.3 включил дополнительные аннотации данных в система.ComponentModel.Имен DataAnnotations в Сборку EntityFramework. В .Net 4.5 в эти заметки были перенесены в быть частью .NET Framework в Система.ComponentModel.DataAnnotations.Пространство имен схемы Система.ComponentModel.DataAnnotations.сборка dll. Если вы используете EF 4.x и таргетинг .NET 4.5 это приводит к двум аннотациям данных с одинаковым именем в разных сборках. Потому что аннотации в .NET Framework находится в другом пространстве имен, которое мы не смогли тип переадресации, чтобы избежать этого конфликт.

можно использовать EF 4.x на .NET 4.5, но мы рекомендуем использовать последняя версия EF 5. Если вы не используете затронутые аннотации данных не влияют на ваш код. Если вы используете аннотации данных в проекте C# можно использовать модификатор extern для убедитесь, что код использует аннотации из EntityFramework.файл DLL (http://msdn.microsoft.com/en-us/library/e59b22c5 (v=VS.80).aspx). Если вы используете новые Примечания от Система.ComponentModel.DataAnnotations.сборка dll в .NET 4.5 они сначала не будет обрабатываться кодом.

пострадавших Примечания:

  • колонки
  • ComplexType
  • DatabaseGenerated
  • DatabaseGeneratedOption
  • иностранный ключ
  • InverseProperty
  • MaxLength
  • MinLength
  • NotMapped
  • таблица

в этот момент я понял, что мой проект данных был недавно создан в VS2012 и по умолчанию был нацелен на .Net 4.5, а остальная часть моего проекта в решениях была перенесена из VS2010 и нацелена на .Net 4.0. Поэтому я обновил все проекты до целевого .Net 4.5 и получил предварительный выпуск EntityFramework 5.0.

убедитесь, что вы сначала обновите свои проекты до Net4.5, после этого обновите EF до 5.0, в противном случае он будет ненавидеть вас навсегда, и многие кролики умрут.

этот скринкаст является отличным стартером для обновления до EF5.0

В этот момент моя ошибка исчезла, но я получал другую. Я не мог добавить миграцию, потому что она не могла найти конфигурацию миграции, хотя я настроил конфигурацию за несколько секунд до нее. Это снова потребовало много возиться с NuGet, удаляя пакеты повторной установки ad. И тут я увидел ... в пакетах.строки конфигурации, как это:

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

я изменил targetFrameworkto "net45", и теперь я получаю ожидаемое поведение от миграций. Я думаю, что был бы лучший способ получить NuGet target .Net 4.5 с пакетами, но это то, что сработало для меня.

Я надеюсь, что это спасет кого-то бъется головой о стену.


    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")]


вот исправление для тех, кто с мертвыми кроликами (обновившись до EF 5.0 перед обновлением до .Net 4.5):

в файлах 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>

довольно очевидно, когда вы это знаете....


Я смог прийти к тому же решению, используя

PM> установить-пакет EntityFramework-Pre

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