无法自动为继承自ICollection

时间:2018-10-24 19:28:05

标签: entity-framework asp.net-core .net-core entity-framework-core

这是我的实体:

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。如何解决此问题?

编辑: 从网上阅读的内容以及收到的回复来看,似乎不可能做到。如果有人有解决方案,请告诉我们:)

1 个答案:

答案 0 :(得分:2)

在我看来,您想要设计一个(至少)两个表的数据库。带有StackImages的表和带有StackFiles的表。

您要在StackImagesStackFiles之间设计一对多关系:每个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或属性。