2016-05-22 2 views
1

Song hat eine viel zu viele Beziehung mit sich. Ich speichere diese IDs in einer Klasse namens SimilarVersion mit beiden ID-Spalten.ASP.NET MVC So greifen Sie auf den von Entity Framework generierten Fremdschlüssel zu?

public class Song 
{ 
    public int Id { get; set; } 

    public string AudioName { get; set; } 

    public string ArtistName { get; set; } 

    ... 

    public virtual ICollection<SimilarVersion> SimilarVersions { get; set; } = new List<SimilarVersion>();  
} 

public class SimilarVersion 
{ 
    public int Id { get; set; } 

    public int? Song_Id1 { get; set; } 
} 

Ansicht Modelle:

public class SongDto 
{ 
    public int Id { get; set; } 

    public string AudioName { get; set; } 

    public string ArtistName { get; set; } 

    ... 

    public ICollection<SimilarSongDto> SimilarSongDtos { get; set; } = new List<SimilarSongDto>(); 
} 

public class SimilarSongDto 
{ 
    public int Id { get; set; } 

    public string AudioName { get; set; } 

    public string ArtistName { get; set; } 

    ... 
} 

Die SimilarVersion Tabelle in meiner Datenbank hat jetzt Id, Song_Id, Song_Id1, wie EF Song_Id erzeugt hat. Wie kann ich diese EF-generierte Spalte in meinem Code verwenden?

_similarVersionService.GetSimiliarVersion().Song_Id wird mir einen Fehler geben, weil es keine Eigenschaft in der Klasse namens das gibt. Ich könnte es manuell zur Klasse hinzufügen, wie ich es mit Song_Id1 getan habe, und die Sammlung aus der anderen Klasse entfernen, aber ich denke, ich muss etwas falsch machen. Bitte sagen Sie mir auch, ob es eine bessere Möglichkeit gibt, dies zu kartieren.

Ich habe versucht, public int Song_Id { get; set; } hinzuzufügen und es machte nur eine andere Spalte in meiner Tabelle Song_Id2 genannt.

Bearbeiten. Der Versuch, eine Zeile basierend auf Admir Antwort hinzuzufügen:

var songToUpload = new Song 
{ 
    AudioName = uploadSongDtos[i].AudioName.Trim(), 
    ArtistName = uploadSongDtos[i].ArtistName,       
}; 

foreach (var compareAgainstString in _songService.GetSongs().ToDictionary(x => x.Id, x => x.AudioName)) 
{ 
     var score = SearchContext.Levenshtein.iLD(songToUpload.AudioName, compareAgainstString.Value); 

     //Don't add the current song 
     if (score < 50 && songToUpload.Id != compareAgainstString.Key) 
      songToUpload.SimilarVersionsWhereSimilar.Add(new SimilarVersion { SimilarId = compareAgainstString.Key }); 
} 

Beide OriginalId und SimilarId zugeordnet sind, was auch immer die ID von songToUpload.Id ist die Beziehung, die wir in den Modellen definiert gegeben, die für OriginalId korrekt ist, aber es ist auch zwingend Mein Custom Set SimilarId oben. Wie kann ich das stoppen?

Antwort

0

Sie können diesen Ansatz:

public class Song 
{ 
    public int Id { get; set; } 

    public string ArtistName { get; set; } 

    public virtual IList<Similarity> SimilaritiesWhereOriginal { get; set; } 

    public virtual IList<Similarity> SimilaritiesWhereSimilar { get; set; } 
} 

public class Similarity 
{ 
    public int Id { get; set; } 

    public int OriginalId { get; set; } 
    public virtual Song Original { get; set; } 

    public int SimilarId { get; set; } 
    public virtual Song Similar { get; set; } 
} 

public class ApplicationDbContext : DbContext 
{ 
    public DbSet<Song> Songs { get; set; } 

    public DbSet<Similarity> Similarities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereOriginal).WithRequired(x => x.Original).WillCascadeOnDelete(false); 
     modelBuilder.Entity<Song>().HasMany(x => x.SimilaritiesWhereSimilar).WithRequired(x => x.Similar).WillCascadeOnDelete(false); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Ähnlichkeit Klasse zeigt die Beziehung zwischen „Original“ Lied und „ähnlich“ Lied. Diese Klasse ersetzt die automatisch generierte EF-Tabelle durch Ihre eigene Viele-2-Viele-Beziehungstabelle, auf die Sie über den Code zugreifen können.

+0

Danke für die Antwort. Ich habe versucht, eine Zeile in die 'SimilarVersion' Tabelle mit Ihrer Antwort hinzuzufügen, aber es funktioniert nicht wie erwartet. Ich habe meine ursprüngliche Frage bearbeitet, um das Problem zu zeigen. Ich verstehe auch nicht, warum wir 'public virtual Song Original' und' public virtual Song Similar' in der 'Similarity' Tabelle brauchen. Ich denke, vielleicht implementiere ich es falsch. –

0

Es ist wahrscheinlich, dass die ID tatsächlich von Ihrem Store generiert wird. Rufen Sie Context.SaveChanges(), um es zu erstellen, dann lesen Sie die ID.

+0

Wie lese ich Id, wenn es keine Eigenschaft in der Klasse gibt? Es ist ein Kompilierzeitfehler. –

+0

Mein Telefon machte es schwierig, einen Teil Ihrer Frage zu lesen. EF6 erschwert den Zugriff auf eine Join-Tabelleneigenschaft. In der Regel erhalten Sie das Objekt, bevor Sie seine ID erhalten. – shannon

Verwandte Themen