这是我的实体:
public class StackImage: ICollection<StackFile>
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual Guid Id { get; set; }
private IList<StackFile> StackFiles { get; set; } = new List<StackFile>();
public StackImage()
{
}
[...] // Implementation of ICollection
}
public class StackFile
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual Guid Id { get; set; }
public string Url { get; set; }
public int Position { get; set; }
public StackFile(){}
}
stackImage.Add(new StackFile(url));
stackImage= await _stackImageRepository.UpdateAsync(stackImage);
await _unitOfWork.SaveChangesAsync();
在此示例中,UpdateAsync之后,未生成StackImage Id(stackImage.Id ==默认值),但正确生成了StackFile Id(stackImage [0] .Id ==默认值)
您是否已经注意到此问题?我的猜测是,EF Core将StackImage视为列表,并且不尝试生成新的Guid。如何解决此问题?
编辑: 从网上阅读的内容以及收到的回复来看,似乎不可能做到。如果有人有解决方案,请告诉我们:)
答案 0 :(得分:2)
在我看来,您想要设计一个(至少)两个表的数据库。带有StackImages
的表和带有StackFiles
的表。
您要在StackImages
和StackFiles
之间设计一对多关系:每个StackImage
的零个或多个StackFiles
,每个StackFile
都属于精确到一个StackImage
。在数据库中,这是使用外键实现的。
因此, StackImage是StackFile并不是正确的。但是,您可以说StackImage有一些StackFiles。
在entity framework code first conventions之后,您的课程应类似于:
class StackImage
{
public Guid Id {get; set;}
...
// every StackImage has zero or more StackFiles (one-to-many):
public virtual ICollection<StackFile> StackFiles {get; set;}
}
class StackFile
{
public Guid Id {get; set;}
...
// every StackFile belongs to exactly one StackImage, using foreign key:
public Guid StackImageId {get; set;}
public virtual StackImage StackImage {get; set;}
}
最后是DbContext:
class MyDbcontext : DbContext
{
public DbSet<StackImage> StackImages {get; set;}
public DbSet<StackFile> StackFiles {get; set;}
}
请注意使用虚拟属性来表达表之间的关系。由于外键StackImageId
应该是实列,因此它不是虚拟的
在实体框架中,表的列由非虚拟属性表示, 虚拟属性表示表之间的关系。
因为我遵循了约定,所以不需要属性,也不需要流畅的API。实体框架检测一对多集合并为您创建适当的表。仅当您要为表或列使用不同的标识符时,才需要流利的API或属性。