Как сначала сопоставить составной первичный ключ в коде Entity Framework 4?

Сначала я разбираюсь с кодом EF4, и пока он мне нравится. Но у меня проблемы с отображением объекта в таблицу с составным первичным ключом.

Конфигурация, которую я пробовал, выглядит так:

public SubscriptionUserConfiguration()

    {
                Property(u => u.SubscriptionID).IsIdentity();
                Property(u => u.UserName).IsIdentity();
    }

Что вызывает это исключение: Невозможно определить ключ для типа сущности SubscriptionUser.

Что мне не хватает?


person jamesfm    schedule 28.04.2010    source источник


Ответы (4)


Вы также можете использовать

HasKey(u => new { u.SubscriptionID, u.UserName });

Редактировать:

Одно ограничение, которое я обнаружил, заключается в том, что следующее не работает:

public ProjectAssignmentConfiguration()
{
    HasKey(u => u.Employee.EmployeeId);
    HasKey(u => u.Project.ProjectId);
}

or

public ProjectAssignmentConfiguration()
{
    HasKey(u => new { u.Employee.EmployeeId, u.Project.ProjectId });
}

Итак, как настроить объект, в котором объединенная таблица имеет первичный ключ, состоящий из внешних ключей?

person djskinner    schedule 26.05.2010
comment
У меня была такая же проблема, мои симптомы заключались в том, что он возвращал нужное количество сущностей, но все сущности, у которых был один и тот же первый ключ, возвращались с содержимым данных первой записи, игнорируя вторую. Также, казалось, делал забавные вещи с моими вставками и вставлял данные других записей, уже находящихся в базе данных. - person zclark; 06.09.2012
comment
Вы можете просто добавить внешний ключ к объекту. Например, вместо u.Project.Id вы можете добавить Project и ProjectId к родительской сущности. - person mbrookson; 26.03.2018

Я попытаюсь объяснить это шаг за шагом, используя следующую Сущность

public class Account
{
    public int AccountId1 { get; set; }
    public int AccountId2 { get; set; }
    public string Description { get; set; }
}
  1. Создайте класс, производный от объекта EntityTypeConfiguaration<TEntity>, чтобы переопределить соглашения

    class AccountEntityTypeConfiguration : EntityTypeConfiguration<Account>
    {
    
        public AccountEntityTypeConfiguration()
        {
          // The Key
          // The description of the HasKey Method says
          // A lambda expression representing the property to be used as the primary key.
          // If the primary key is made up of multiple properties then specify an anonymous type including the properties.
          // Example C#: k => new { k.Id1, k.Id2 }
          // Example VB: Function(k) New From { k.Id1, k.Id2 }
          this.HasKey(k => new { k.AccountId1, k.AccountId2 } );  // The Key
    
          // Maybe the key properties are not sequenced and you want to override the conventions
          this.Property(p => p.AccountId1).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
          this.Property(p => p.AccountId2).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
    
          this.Property(p => p.Description).IsRequired();  // This property will be required
          this.ToTable("Account");  // Map the entity to the table Account on the database
        }
    }
    
  2. При создании класса, производного от объекта DbContext, переопределите метод OnModelCreating и добавьте новый объект AccountEntityTypeConfiguration в Конфигурации Построителя моделей.

    public class MyModelAccount : DbContext
    {
        public DbSet<Account> Accounts { get; set;}
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // Add a new AccountEntityTypeConfiguration object to the configuration of the model, that will be applied once the model is created. 
            modelBuilder.Configurations.Add(new AccountEntityTypeConfiguration());
        }
    
    }
    

Надеюсь, это вам поможет!

person sergioacortes    schedule 17.11.2011

Вы также можете использовать атрибут Column

public class UserProfileRole
{
    [Key, Column(Order = 0)]
    public int UserId { get; set; }

    [Key, Column(Order = 1)]
    public int RoleId { get; set; }
}
person Aaron Hoffman    schedule 07.08.2013
comment
просто предупреждение для тех, кто ищет - ColumnAttribute требует .NET 4.5 - person zomf; 25.02.2014

Решено: я должен использовать HasKey, а не Identity. Это работает:

public SubscriptionUserConfiguration()
{
     HasKey(u => u.SubscriptionID);
     HasKey(u => u.UserName);
}
person jamesfm    schedule 29.04.2010
comment
А может, стоит воспользоваться формой, предложенной Даниилом? stackoverflow.com/questions/3299268/ Я предполагаю, что это сработало для вас, хотя. - person Derek Morrison; 18.08.2010