2011-06-13 53 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