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();
我建立了代码优先的多对多关系,它为 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();