ASP.NET MVC5 + EntityFramework - relacja wiele do wielu

0

Witam,

Problem dotyczy braku powiązywania relacjami wpisów z 2 tabel.

Utworzyłem 2 klasy:

Plik:

public class File
{
public int FileId {get; set;}
public string Name{get; set;{
public ICollection<int> TagId {get; set;}
public virtual ICollection<Tag> Tag {get; set;}
}

Tag:

public class Tag
{
public int TagId {get; set;}
public string Name {get; set;}
public ICollection<int> FileId {get; set;}
public ICollection<File> File {get; set;}
}

Tworzenie tabel:

public DbSet<File> Files { get; set; }
public DbSet<Tag> Tags{ get; set; }

W bazie danych utworzyła mi się dodatkowo tabela TagFile, w której znajdują się relacje pomiędzy tabelami.

Dopisałem klasę StartInitializer, która inicjuje mi bazę danych za każdym razem na nowo. Wewnątrz metody inicjalizującej dodaję nowe rekordy:

...
var tags = new List<Tag>
{
new Tag() { TagId = 1, Name = "A"},
new Tag() { TagId = 2, Name = "B"},
new Tag() { TagId = 3, Name = "C"},
new Tag() { TagId = 4, Name = "D"},
new Tag() { TagId = 5, Name = "E"},
new Tag() { TagId = 6, Name = "F"},
new Tag() { TagId = 7, Name = "G"}
};
tags.ForEach(g => context.Tags.Add(g));
context.SaveChanges();

var files = new List<File>
{
new File() { FileId = 1,  Name = "1", TagId = new List<int>{1, 3, 2, 4}}
};
files.ForEach(g => context.Files.Add(g));
context.SaveChanges();

Niestety wpisy w tabeli FileTag nie dodają się automatycznie, chociaż wydaje mi się że TagId = new List<int>{1, 3, 2, 4} powinien to zapewniać. Czegoś tu brakuje?

3

z modelu wywal pola:
public ICollection<int> TagId {get; set;}
oraz
public ICollection<int> TagId {get; set;}

a w klasie StartInitializer powinno to wyglądać tak:

var tags = new List<Tag>()
                {
                new Tag() { TagId = 1, Name = "A"},
                new Tag() { TagId = 2, Name = "B"},
                new Tag() { TagId = 3, Name = "C"},
                new Tag() { TagId = 4, Name = "D"},
                new Tag() { TagId = 5, Name = "E"},
                new Tag() { TagId = 6, Name = "F"},
                new Tag() { TagId = 7, Name = "G"}
                };
            tags.ForEach(g => context.Tag.Add(g));
            context.SaveChanges();
            var files = new List<File>()
            {
            new File() { FileId = 1,  Name = "1", Tag= context.Tag.ToList()}
            };
            files.ForEach(g => context.File.Add(g));
            context.SaveChanges();

oczywiście jak nie wywalisz tych pól to po zmianie klasy StartInitializer którą sugeruję też powinno hulać :)

2
te napisał(a):
tags.ForEach(g => context.Tag.Add(g));

Bo context.Tag.AddRange(tags); jest zbyt mainstreamowe...

0

może i nie jest ale w ef5 nie ma tej metody :P

0

To chyba jeśli ktoś zrobił ICollection, zamiast IList czy po prostu DbSet.

1

@te skoro @radmistrz2 używa ASP.NET MVC 5 to na 99% używa EF wersji 6 lub 7. AddRange zostało dodane w wersji 6 która została wypuszczona w 2013 roku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1