2011-06-13 104 views
0

按慣例使用以下類EF將正確創建表和PK/FK關聯。但是,當我將數據添加到照片集合並保存實體時,照片表格中的數據不會保存到數據庫表格中。EF關聯數據未持久保存到數據庫

我避免使用從ICollection繼承公共屬性的任何集合類型,而是使用私人支持字段,因爲我想控制對添加/刪除方法的訪問。有什麼額外的我需要添加到OnModelCreating告訴EF IEnumerable Photos中有數據並堅持它?

(數據來自專輯類可以正確保存)

public class Album 
{ 
    private readonly ICollection<Photo> _photos = new List<Photo>(); 
    public Guid Id {get; set;}  
    public string Name {get; set;} 
    public virtual IEnumerable<Photo> Photos 
    { 
     get{ return _photos;} 
    } 

    public void AddPhoto(byte[] bytes, string name) 
    { 
     //some biz rules 
     Photo p = new Photo(); 
     p.Bytes = bytes; 
     p.Name = name; 
     _photos.Add(p); 
    } 
} 

public class Photo 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public byte[] Bytes {get; set;} 
} 

public class AlbumDbContext : DbContext 
{ 
    public AlbumDbContext() 
    { 
     this.Database.CreateIfNotExists(); 
    } 

    public DbSet<Album> Albums { get; set; }   


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {    
    } 
} 

回答

2

我甚至不知道,當你沒有實體的定義密鑰和上下文沒有定義設置Photos該表和關係是正確創建特別。無論如何ICollection<T>是必須的。你的班級不是有效的實體,即使你以某種方式使其工作,我希望你會有麻煩使用它 - 例如,你可以忘記延遲加載。

以這種方式處理它沒有意義,因爲任何人都可以將枚舉轉換回集合。您必須製作集合的可枚舉副本才能使其工作正常。

這也許可以工作的唯一辦法是:

public class Album 
{ 
    public class AlbumConfiguration : EntityTypeConfiguration<Album> 
    { 
     public AlbumConfiguration() 
     { 
      // Inner class will see private members of the outer class 
      HasMany(a => a._photos)... 
     } 
    } 

    private readonly ICollection<Photo> _photos = new List<Photo>(); 
    public string Name {get; set;} 
    public virtual IEnumerable<Photo> Photos 
    { 
     get{ return _photos;} 
    } 

    public void AddPhoto(byte[] bytes, string name) 
    { 
     //some biz rules 
     Photo p = new Photo(); 
     p.Bytes = bytes; 
     p.Name = name; 
     _photos.Add(p); 
    } 
} 

和你的背景下看起來像:

public class AlbumDbContext : DbContext 
{ 
    public DbSet<Album> Albums { get; set; }   
    public DbSet<Photo> Photos { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {  
     modelBuilder.Configurations.Add(new Album.AlbumConfiguration());   
    } 
} 

該解決方案是很醜陋,因爲它使你的實體依賴於實體框架。

+0

是的,實際的代碼有Id屬性。只是更新了代碼的完整性。 – Fixer 2011-06-13 15:38:46

+0

你能解釋一些關於將enumerable轉換回集合的更多信息嗎?那可能怎麼樣?添加照片的唯一方法是通過AddPhoto方法。應該沒有辦法讓客戶改變收藏......? – Fixer 2011-06-13 15:48:39

+1

你可以簡單地調用'(列表)專輯。照片' – 2011-06-13 15:50:05