2017-02-03 49 views
0

問:當我嘗試返回從_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; 
} 

它返回IdPlayerName絕對正確,但對於null名單PlayerSkills

_Db在同一Controller類被初始化爲Get()通過以下方式:

ApplicationDbContext _Db = new ApplicationDbContext();  
+0

但從SQL來看,應該'PlayerSkills'具有存儲收集的字符串是什麼類型的字段? –

+0

好吧,只是踢布什..它是代碼第一,模型第一,數據庫第一?如果它是數據庫第一[謝爾蓋Berenzovskiy答案會做(http://stackoverflow.com/a/42026587/4648586) - 也許。還有,可能影響事物的一點點......是它的實體核心嗎?或實體框架6?啊!看着你的'公開名單 PlayerSkills'我不知道你所理解的[一對多的關係(HTTP://計算器。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數據庫許多關係,你需要將存儲玩家的技能和這些技能都與玩家的ID第二個表。如果你想避免重複技能 - 甚至兩張牌桌 - 技能和交界表,以便將玩家映射到技能。


無結表(如果你不想爲外鍵明確的財產,那麼你的選擇是一口流利的映射,而不是屬性映射):

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); 
}