按惯例使用以下类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)
{
}
}
答案 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());
}
}
这个解决方案非常难看,因为它会让你的实体依赖于实体框架。