Pytanie Jak najpierw odwzorować złożony klucz podstawowy w kodzie Entity Framework 4?


Najpierw sprawdzam kod EF4 i lubię go do tej pory. Ale mam problem z odwzorowaniem obiektu na tabelę z złożonym kluczem podstawowym.

Konfiguracja, którą wypróbowałem, wygląda następująco:

public SubscriptionUserConfiguration()

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

Który rzuca ten wyjątek: Nie można uzyskać klucza dla typu jednostki "SubscriptionUser".

czego mi brakuje?


44
2018-04-28 21:26


pochodzenie




Odpowiedzi:


Możesz również użyć

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

Edytować:

Jednym z ograniczeń, które znalazłem, jest to, że poniższe nie działają:

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

lub

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

Jak skonfigurować jednostkę, w której tabela dołączania ma klucz podstawowy składający się z kluczy obcych?


69
2018-05-26 12:29



Po prostu miałem ten sam problem, moje symptomy były takie, że zwracał odpowiednią ilość jednostek, ale wszystkie jednostki, które miały ten sam pierwszy klucz, powróciły z zawartością danych pierwszego rekordu, ignorując drugi. Wydawało mi się również, że robię śmieszne rzeczy z moimi wkładkami i podłączam dane innych rekordów już znajdujących się w bazie danych. - zclark
Możesz po prostu dodać klucz obcy na encję. Na przykład, zamiast u.Project.Id możesz dodać Project i ProjectId do jednostki nadrzędnej. - m.brookson


Spróbuję wyjaśnić to krok po kroku, używając następującej jednostki

public class Account
{
    public int AccountId1 { get; set; }
    public int AccountId2 { get; set; }
    public string Description { get; set; }
}
  1. Utwórz klasę pochodną EntityTypeConfiguaration<TEntity> Obiekt zastępujący konwencje

    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. Kiedy tworzymy klasę pochodną od DbContext Obiekt, przesuń OnModelCreating Metodę i dodaj nową AccountEntityTypeConfiguration obiekt do Konfiguracji modelu Konstruktora.

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

Mam nadzieję, że to pomoże!


20
2017-11-17 11:19





Możesz także użyć Column atrybut

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

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

14
2017-08-07 22:56



tylko heads-up dla tych, którzy szukają - ColumnAttribute wymaga .NET 4.5 - zomf


Rozwiązał: powinienem używać HasKey, a nie Tożsamości. To działa:

public SubscriptionUserConfiguration()
{
     HasKey(u => u.SubscriptionID);
     HasKey(u => u.UserName);
}

6
2018-04-29 07:47



A może konieczne jest skorzystanie z formularza zaproponowanego przez Daniela? stackoverflow.com/questions/3299268/...  Zakładam, że ci się udało. - Derek Morrison