2013-02-02 2 views
1

J'ai une classe agrégée qui contiendra une collection d'une autre classe, mais cette classe n'existera jamais dans une collection sur cet agrégat, donc je n'ai pas besoin pour une identification sur elle dans mon code, ou un besoin d'une référence à l'agrégat. Par exemple:Clé implicite pour une relation un-à-plusieurs dans le code EF d'abord

public class SalesListing 
{ 
    public Guid Id { get; set; } 
    public ICollection<LocalizedDescription> Descriptions { get; set; } 
} 

public class LocalizedDescription 
{ 
    public string CultureCode { get; set; } 
    public string Title { get; set; } 
} 

Je voudrais simplement déclarer la clé de la classe LocalizedDescription comme une combinaison de SalesListingId et CultureCode sans créer une propriété SalesListingId ou renvoi à SalesListing. Un moyen de le faire avec EF 5.0?

Par exemple, voici un exemple que j'imagine une telle API ressemblerait si elle existe:

modelBuilder.Entity<LocalizedDescription>().BelongsTo<SalesListing>(s => s.Description) 
      .WithKey((s, ld) => new { s.Id, ld.CultureCode }) 

Répondre

1

Non, vous aurez toujours besoin de spécifier un ID

0

Vous pouvez définir des clés composites utilisant la syntaxe suivante:

modelBuilder.Entity<LocDesc>().HasKey(ld => new { ld.CultureCode, ld.Title }); 

Ce dit, je pense que vous regretterez de ne pas définir une clé primaire entière. Si vous avez besoin d'exporter le contenu (par exemple pour une révision externe ou une traduction), les enregistrements correspondants par ID seront plus rapides et moins sujets aux erreurs que ceux correspondant au titre. Avoir l'ID ne fait pas de mal et est plus facile à inclure maintenant que de mettre à niveau plus tard.

Je pense que vous pouvez spécifier le mappage FK implicitement en ne fournissant pas une propriété spécifique pour la relation dans la définition de la cartographie:

modelBuilder.Entity<SalesListing>().HasMany(e => e.Descriptions).WithRequired(); 

Si vous devez spécifier la propriété clé étrangère, introduire une propriété SalesListingID pour la valeur et utilisez plutôt la cartographie suivante:

modelBuilder.Entity<SalesListing>().HasMany(e => e.Descriptions).WithRequired() 
    .HasForeignKey(r => r.SalesListingID); 
+0

« Cela dit, je pense que vous r l'aigrette ne définit pas une clef primaire entière "- je sais, donc je veux le dire" hey, LocalizedDescriptions appartiennent à SalesListing, donc faites une clé basée sur SalesListingId et CultureCode "mais j'essaye d'être puriste ici et ne pas encombrer mes objets avec RMDB détails. –

+0

Ouais le simple '.WithRequired()' ne fonctionne pas - il exige une clé étrangère –

Questions connexes