具有多重关系的实体框架核心 TPH

时间:2021-01-03 20:12:50

标签: c# entity-framework-core foreign-keys ef-code-first ef-database-first

我的数据库结构中的关系和鉴别器有问题。我需要做这样的事情:

Table that I need

<头>
ID RefId RefTypeId 姓名
1 1 卢克
2 2 奎托斯
3 2 黑豹
4 3 关注

Owner Id - 是来自 Dog Table 或 Cat Table 的 ID,一切都取决于字段“OwnerTypeId”

public abstract class HomeAnimal
{
   public int Age {get; set;}
   public int RefId { get; set; }
}


public class DogAnimal : HomeAnimal
{
   public Dog Dog { get; set; }
}

public class CatAnimal : HomeAnimal
{
   public Cat Cat { get; set; }
}

Dog 和 Cat 有其他类 - 基本字段和其他。 在方法 OnModelCreating(ModelBuilder modelBuilder) 中,我为 HomeAnimal 添加了鉴别器,例如:

modelBuilder.Entity<HomeAnimal>()
             .ToTable("HomeAnimals")
             .HasDiscriminator<int?>("RefType")
              HasValue<DogAnimal>((int)RefType.Dog)
             .HasValue<CatAnimal>((int)RefType.Cat);

在快照中一切正常,但如果我尝试向数据库添加新记录,则会出现关于“INSERT 语句与 FOREIGN KEY 约束冲突”的错误

如何为 HomeAnimal 类中的 RefId 设置多个关系?

编辑: 添加狗类,例如

public class Dog{
   public string Type {get;set}
   public ICollection<DogAnimal> DogAnimals {get;set;}
}

Cat 类与 dog 相同,但具有用于 CatAnimal 的 ICollection。我没有这两个类的任何配置。我正在 SMSS 中对其进行测试 - 尝试插入具有正确引用类型的新记录。我在 Dog 和 Cat 表中有一行 - 这不是插入错误数据的问题

编辑 2:

var newDog = new Dog()
{
   Name = "23",
};
context.Add(newDog);
context.SaveChanges();

var newDogAnimal = new DogAnimal()
{
   Age = 13,
   RefId = newDog.Id,
};

context.Add(newDogAnimal);
context.SaveChanges();
/// Here throw error, after save changes

保存更改出错 ->

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_HomeAnimal_Cat_OwnerId".The conflict occurred in database "TestDatabase", table "dbo.Cat", column 'Id'.
The statement has been terminated.

0 个答案:

没有答案