EF关联数据不会持久保存到数据库中

时间:2011-06-13 15:12:12

标签: c# entity-framework design-patterns ef-code-first

按惯例使用以下类EF将正确创建表和PK / FK关联。但是,当我将数据添加到照片集并保存实体时,照片表中的数据不会保存到数据库表中。

我避免使用任何从ICollection继承公共属性的集合类型,而是使用私有支持字段,因为我想控制对Add / Remove方法的访问。还有什么需要添加到OnModelCreating以告诉EF IEnumerable Photos中有数据并坚持下去吗?

(可以正确保存Album类中的数据)

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

1 个答案:

答案 0 :(得分: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());          
    }
}

这个解决方案非常难看,因为它会让你的实体依赖于实体框架。