如何解决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());
}
}
该解决方案非常丑陋,因为它使您的实体依赖于实体框架。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。