Entity Framework 核心代码先多对多保存只用外键

Entity Framework Core code first many-to-many save with only foreign keys

我建立了代码优先的多对多关系,它为 API 生成了数千条虚假记录。现在我试图在该关系的一侧保存一条新记录,只给出另一侧的 ID,因为客户端正在传递一个 int id 数组。

我发现了很多关于一般情况下保存多对多的问题和答案,但 none 特别是关于仅使用外键列表进行保存的问题。也许我只是用错了术语?

我可以预先抓取那些id的所有记录,但是等待数据库查询,将这些实体分配给新实体,然后再次去数据库保存,这似乎很繁重,当我所有的时候真正需要的是与我已有的ids建立关系。

对于单一关系,我只需将外键添加为单独的 属性 并设置它而不是外部实体本身:

public int? CarId { get; set; }
[ForeignKey("CarId")]
public CarModel? Car { get; set; }

是否有类似的多对多范例?

实体设置:

public class ClownModel {
    public int Id { get; set; }
    public List<CarModel> Cars { get; set; }
}
public class CarModel {
    public int Id { get; set; }
    public List<ClownModel> Clowns { get; set; }
}

数据库上下文 OnModelCreating:

builder.Entity<ClownModel>()
    .HasMany(x => x.Cars)
    .WithMan(x => x.Clows);

您可以使用“存根实体”将现有的汽车添加到新的或现有的小丑中,而无需获取汽车。例如

var newClown = new Clown();

var car = new Car() { Id = carId };
db.Entry(car).State = EntityState.Unchanged;

newClown.Cars.Add(car);

db.Set<Clown>().Add(newClown);
db.SaveChanges();

或者在模型中包含链接实体,无需添加 DbSet 属性 或更改 Many-to-Many 导航属性即可完成。

例如

builder.Entity<Clown>()
        .HasMany(x => x.Cars)
        .WithMany(x => x.Clowns)
        .UsingEntity<ClownCar>(
            c => c.HasOne(x => x.Car)
                  .WithMany()
                  .HasForeignKey(x => x.CarId),
            c => c.HasOne(c => c.Clown)
                  .WithMany()
                  .HasForeignKey(c => c.ClownId)
                  );

然后

var newClown = new Clown();

var clownCar = new ClownCar();
clownCar.CarId = carId;
clownCar.Clown = newClown;

db.Set<ClownCar>().Add(clownCar);
db.SaveChanges();