single primary not net framework foreign allowed entity-framework orm composite-key

entity-framework - net - single id is not allowed on composite primary key in entity



¿Cómo mapeo primero una clave primaria compuesta en el código de Entity Framework 4? (4)

Lo resolvió: debería usar HasKey, no Identity. Esto funciona:

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

Primero me estoy familiarizando con el código EF4 y me gusta hasta ahora. Pero estoy teniendo problemas para asignar una entidad a una tabla con una clave primaria compuesta.

La configuración que he probado se ve así:

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

Que arroja esta excepción: no se puede inferir una clave para el tipo de entidad ''SubscriptionUser''.

¿Qué me estoy perdiendo?


También podrías usar

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

Editar:

Una limitación que he encontrado es que los siguientes no funcionan:

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

o

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

Entonces, ¿cómo se configura una entidad donde la tabla de unión tiene una clave primaria compuesta de claves externas?


También puede usar el atributo Column

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


Trataré de explicarlo paso a paso, usando la siguiente Entidad

public class Account { public int AccountId1 { get; set; } public int AccountId2 { get; set; } public string Description { get; set; } }

  1. Cree una clase derivada del objeto EntityTypeConfiguaration<TEntity> para anular las convenciones

    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. Cuando cree la clase derivada del Objeto DbContext , anule el Método OnModelCreating y agregue un nuevo objeto AccountEntityTypeConfiguration a las Configuraciones del AccountEntityTypeConfiguration Builder.

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

Espero que te ayude!