c# - 在多对多关系的联结表的情况下,有没有办法不经常调用 SaveChanges?
问题描述
我需要在多对多关系的联结表中有一个额外的字段,如下所示:
public class PersonCompany
{
public int PersonId { get; set; }
public int CompanyId { get; set; }
public Person Person { get; set; }
public Company Company { get; set; }
public DateTime HireDate { get; set; }
}
在关系的末尾有这两个类:
public class Company
{
public int CompanyId { get; set; }
public string Name { get; set; }
public virtual ICollection<PersonCompany> PersonCompanies { get; set; }
}
public class Person
{
public Person()
{
PersonCompanies = new List<PersonCompany>();
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<PersonCompany> PersonCompanies { get; set; }
}
然而,当使用它时,我必须在上下文中调用 SaveChanges 太多次,以便主键和外键获取它们的值,就像在这个例子中一样:
private static void AddPersonWithCompanies()
{
using (var context = new Context())
{
var person = new Person
{
LastName = "Dent",
FirstName = "Juan",
IsActive = false
};
context.People.Add(person);
context.SaveChanges();
var comp1 = new Company() { Name = "Universal" };
var comp2 = new Company() { Name = "Lehmann" };
context.Companies.Add(comp1);
context.Companies.Add(comp2);
context.SaveChanges();
var pc1 = new PersonCompany() { Company = comp1, Person = person, HireDate = DateTime.Today };
var pc2 = new PersonCompany() { Company = comp2, Person=person, HireDate = DateTime.Today };
person.PersonCompanies.Add(pc1);
person.PersonCompanies.Add(pc2);
context.SaveChanges();
}
}
我希望最后只有一个 SaveChanges() 但似乎无法得到它......如果删除了这些中间 SaveChanges() ,我会收到以下异常:
System.Data.Entity.Infrastructure.DbUpdateException
HResult=0x80131501
Message=Unable to determine the principal end of the 'Chapter3.CSharp.Company_PersonCompanies' relationship. Multiple added entities may have the same primary key.
Source=EntityFramework
StackTrace:
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at Chapter3.CSharp.Program.AddPersonWithCompanies() in C:\Users\Juan Dent\OneDrive\CSharp\Code First-Code Bundle\B03947_03_Code\Chapter3.CSharp\Program.cs:line 47
at Chapter3.CSharp.Program.Main(String[] args) in C:\Users\Juan Dent\OneDrive\CSharp\Code First-Code Bundle\B03947_03_Code\Chapter3.CSharp\Program.cs:line 14
有任何想法吗?
问候,胡安
解决方案
推荐阅读
- google-cloud-platform - 为数据库中的每个项目调用 Cloud Run
- networking - 如何在 Linux 中设置 UDP 数据包通过 wifi 上的语音队列发送?
- c++ - 是否可以为可使用点运算符访问的数据类型创建 C++ 函数?
- flutter - 实现存储库接口的内存缓存类的问题
- laravel - Laravel Cashier - 防止重复的付款方式
- apache - XAMPP 虚拟主机不起作用,尝试了一切
- dart - “参数类型'用户?函数(用户)'不能分配给参数类型'用户函数(用户?)'。”
- laravel - Microsoft Graph API 日历/getSchedule POST 请求参数
- reactjs - 'useEffect' 不只运行一次
- node.js - 为什么我在使用 Node/Expree 和 Pug 时不能将函数的创建和导出分开?