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

问题描述

| 按照惯例,使用以下类EF将正确创建表和PK / FK关联。但是,当我将数据添加到照片集并保存实体时,“照片”表中的数据不会保存到数据库表中。 我避免使用任何从ICollection继承的公共属性集合类型,而是使用私有后备字段,因为我想控制对Add / Remove方法的访问。我还需要添加其他内容到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)
    {              
    }
}
    

解决方法

        我什至不知道正确创建了表和关系,尤其是当您的实体都没有定义键并且上下文没有为define1定义集合时。无论如何,
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());          
    }
}
该解决方案非常丑陋,因为它使您的实体依赖于实体框架。