Code EF en premier - clé composite

c# code-first entity-framework

Question

J'ai une base de données existante qui a deux colonnes et je veux les mapper comme 1 ID est-ce possible

par exemple

    public class Product
{ 
public string ProductID {get;set;}
public string ShortDescription {get;set;}
public string UserName {get;set;}
}

alors mon Modelbinder ressemble à ceci

modelBinder.Entity<Product>().
HasKey(p=>p.ProductID)
.MapSingle(product =>
new {
 colShotDesc = product.ShortDescription,
 colUser = product.UserName
}
).ToTable("Products");

Ce dont j'ai besoin serait quelque chose comme ProductID = ShortDescription + UserName dans le mappage ... parce que ces deux colonnes partagent une seule et même contraint clé ...

Je ne sais pas si cela a du sens, mais toute suggestion serait géniale ... S'il vous plaît, ne posez pas de questions sur la conception de la base de données => c'est comme ça et ne devrait pas être changé ... aidez-moi (j'espère croiser les doigts) ... parce qu'il semble que la base de données n'a pas encore défini pk, mais uniquement des contraintes clés uniques ...

de toute façon ... l'aide serait formidable ..

Réponse populaire

On dirait que vous voulez un type complexe ET voulez que le type complexe soit reconnu comme clé en utilisant la convention d'ajouter un ID à la fin du nom de la propriété.

EF CF ne peut pas faire cela pour le moment.

Vous pouvez indiquer à EF CF une clé composite via l'attribut Key ou FluentAPI.

Annotation des données:

public class Product 
{  
  [Key, Column(Order=0)]
  public string ShortDescription {get;set;} 
  [Key, Column(Order=1)]
  public string UserName {get;set;} 
}

API Fluent:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>()
               .HasKey(p=> new{p.ShortDescription, p.UserName});
}

Vous pouvez créer un type complexe que vous pouvez utiliser dans votre code pour travailler plus comme vous voulez que votre code fonctionne de manière conceptuelle.

public class Product 
{  
  public ProductID Key {get;set;}
}

public class ProductID 
{
  public string ShortDescription {get;set;} 
  public string UserName {get;set;} 
}

Ensuite, pour le mapper à l'aide de l'API Fluent:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}

Ou si vous souhaitez utiliser les annotations de données:

[ComplexType]
public class ProductID
{
  [Column("ShortDescription")]
  public string ShortDescription {get;set;} 
  [Column("UserName")]
  public string UserName {get;set;} 
}

Vous devez spécifier les noms de colonne ou la configuration va supposer que les noms de colonne sont ProductID_ShortDescription ....

Voici quelques informations supplémentaires sur les types complexes.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow