2017-02-03 2 views
0

Q: При попытке вернуть данные из _Db я получаю пустой объект в List свойства, и я удивляюсь, почему другие свойства возвращается правильно, в то время как List нет?DbContext возвращает некоторые пустые поля

Объяснения проблемы: У меня есть ApplicationDbContext класса, который имеет public IDbSet<Player> Players { get; set; } свойства. Со следующим ApplicationDbInitializer класс:

public class ApplicationDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext> 
{ 
    protected override void Seed(ApplicationDbContext context) 
    { 
     context.Players.Add(new Player { PlayerName = "john", PlayerSkills = new List<string> { "a", "b" } }); 
     context.Players.Add(new Player { PlayerName = "Wuli", PlayerSkills = new List<string> { "c", "d" } }); 

     base.Seed(context); 
    } 
} 

Мой Player класс выглядит следующим образом:

public class Player 
{ 
    [Key] 
    public int Id { get; set; } 
    public string PlayerName { get; set; } 
    public List<string> PlayerSkills { get; set; } 
} 

Мой запрос данных выглядит следующим образом:

public IEnumerable<Player> Get() 
{ 
    return _Db.Players; 
} 

возвращает Id и PlayerName абсолютно правильно, но null для PlayerSkills Список.

_Db инициализируется в том же классе, как ControllerGet() следующим образом:

ApplicationDbContext _Db = new ApplicationDbContext();  
+0

С SQL точки зрения, какой тип поля должен 'PlayerSkills' должны коллекции магазина строк? –

+0

ну, просто пинающий куст .. это код первый, модель первая, база данных сначала? если это первая база данных [Сергей Беренцовский ответ будет] (http://stackoverflow.com/a/42026587/4648586) - возможно. также, бит-точка, которая может повлиять на вещи .. это ядро ​​сущности? или инфраструктура сущности 6? ах! глядя на ваш 'public List PlayerSkills' Интересно, поняли ли вы отношения [от одного до многих] (http: // stackoverflow.com/questions/41217027/database-one-to-one-vs-one-to-many). –

+0

@BagusTesa это первый код и структура сущности 6. Да, возможно, что я пропустил некоторые концепции - первый раз работаю с db. – pushandpop

ответ

3

Существует тип поля в SQL, который может хранить коллекцию значений. Если вы посмотрите на таблицу, которая была создана EF, вы не увидите там PlayerSkills. И сценарий создания будет выглядеть

CREATE TABLE [dbo].[Players] (
    [Id] [int] NOT NULL IDENTITY, 
    [PlayerName] [nvarchar](max), 
    CONSTRAINT [PK_dbo.Players] PRIMARY KEY ([Id]) 
) 

Вот почему вы не получаете никаких данных в PlayerSkills поле. Если вы хотите сохранить один из многих отношений в базе данных SQL, вам понадобится вторая таблица, в которой будут храниться навыки игрока и идентификатор игрока, с которыми связаны эти навыки. Или даже две таблицы, если вы хотите избежать дублирования навыков - один для навыков и таблицы соединений для сопоставления игроков навыкам.


Без соединения таблицы (если вы не хотите, явное свойство внешнего ключа, то ваш вариант свободно отображение вместо отображения атрибутов):

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Player>() 
     .HasMany(p => p.PlayerSkills).WithRequired(); 

    base.OnModelCreating(modelBuilder); 
} 

PlayerSkills

public class PlayerSkill 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Игрок

public class Player 
{ 
    public int Id { get; set; } 
    public string PlayerName { get; set; } 
    public virtual List<PlayerSkill> PlayerSkills { get; set; } 
} 

С соединительной таблице

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Player>() 
     .HasMany(p => p.PlayerSkills) 
     .WithMany() 
     .Map(j => j.MapLeftKey("PlayerId") 
        .MapRightKey("PlayerSkillId") 
        .ToTable("PlayerToSkill")); 

    base.OnModelCreating(modelBuilder); 
} 
Смежные вопросы