实体框架核心:通用对象表之间的多对多关系

时间:2018-06-01 15:20:20

标签: c# entity-framework-core

我有一个Cat和Dog表,我想为Image表创建多对多关系。我不想为每个表(DogImage,CatImage,BirdImage等)创建连接表,所以我想我会创建一个EntityImage连接表,然后使用Type字段来了解它是什么类型的图像。这是我对下面模型的尝试,但是这会在EntityImage表中创建CatId,DogId等外键,而不是使用我试图定义的EntityId。有谁知道如何使用最新的Entity Framework Core正确处理这个问题? 谢谢!

public class Cat
{
    [Key] public int CatId { get; set; }
    public string CatName { get; set; }
    public ICollection<EntityFile> Files { get; } = new List<EntityFile>();
}

public class Dog
{
    [Key] public int DogId{ get; set; }
    public string DogName { get; set; }
    public ICollection<EntityImage> Images { get; } = new List<EntityImage>();
}

public class Image
{
    [Key] public int ImageId { get; set; }
    public string ImageName{ get; set; }
    public Byte[] Content { get; set; }
}

public class EntityImage
{
    public int EntityId { get; set; }
    public int ImageId { get; set; }
    public int ImageType { get; set; }
    public Image Image { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<EntityImage>().ToTable("EntityImage").HasKey(t => new { t.EntityId, t.ImageId });
}

1 个答案:

答案 0 :(得分:0)

EF Core还没有一些更复杂的关系处理(例如分层)。

在您的特定示例中,您可以使用

public class Animal {
    public string Name {get; set;}
    public byte[] Image {get; set;}
}

public class Cat : Animal {
    public int Id {get; set;}
}

public class Dog : Animal {
    public int Id {get; set;}
}

在EF 6中,你可以拥有Animal,Dog&amp;猫都去了不同的桌子。 EF会设置钥匙和钥匙。导航领域为您服务。对象的类型(Dog / Cat)将控制您将看到的Animal中的哪些记录。请注意,这是一对一关系(分层)的特殊情况。

你提到过很多人,但我发现两只动物不太可能拥有相同的图像,如果物种名称重复是一个问题,请将名称移至派生类(狗/猫)。

在某些时候EF Core可能会这样做,我还没有看到它(DataAnnotation / Fluent)。