Подтвердить что ты не робот

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

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

Невозможно определить составной порядок первичного ключа для типа "Models.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.
 }

Вот класс Project:

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Затронутые аннотации:

  • Столбец
  • ComplexType
  • DatabaseGenerated
  • DatabaseGeneratedOption
  • ForeignKey
  • 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, удалив повторную установку пакетов. Затем я увидел в lines.config строки вроде этого:

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

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

Надеюсь, это спасет кого-то, ударяющего головой о стену.

Ответ 2

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

Ответ 3

Вот исправление для тех, у кого мертвые кролики (обновленные до 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>

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