[英]Why I can't add newly created principal entity when use DbSet.Add()?
我有兩節課,他們是一對一的關系
public class Car
{
public long Id { get; set; }
public string Name { get; set; }
public long CompanyId { get; set; }
public Company Company { get; set; }
}
public class Company
{
public long Id { get; set; }
public string Name { get; set; }
public Car Car { get; set; }
}
假設我已經向Company表添加了一條記錄(ID = 1),所以現在我想添加一條新的Car記錄為
Car c = new Car { Name = "car1" };
c.CompanyId = 1;
context.Cars.Add(c);
context.SaveChanges();
上面的方法行得通,我可以,但是如果我嘗試以下方法,則行不通並拋出異常(無法添加顯式值來標識列:
Car c = new Car { Name = "car1" };
Company com = new Company { Id = 1 };
c.Company = com;
context.Cars.Add(c);
context.SaveChanges();
那么為什么DbSet.Add()認為我要添加新的公司記錄? 難道不足夠聰明,以至於在Company表中已經存在一個ID為1的公司記錄?
這是因為在創建兩個new
對象之間的關系時,默認情況下,實體框架會嘗試將兩個對象及其之間的關系添加到數據庫中。 您可以使用以下方法阻止添加子對象:
context.Entry(com).State = EntityState.Detached
或者你可以嘗試
Car c = new Car {
Name = "car1",
Company = context.Companies.First(x => x.Id == 1)
};
context.Cars.Add(c);
context.SaveChanges();
DbContext
實例會將實體上的關系添加為數據庫中的已添加(新)項,並在持久保存更改后將添加這些關系( SaveChanges
)。 對於沒有Unchanged
的任何實體,您可以將狀態手動更改回“未更改”。
Car c = new Car { Name = "car1" };
Company com = new Company { Id = 1 };
c.Company = com;
context.Cars.Add(c);
// mark the company as unchanged
context.Entry(com).State = EntityState.Unchanged;
context.SaveChanges();
或者,您可以查詢DbContext作為Company
的實例,並使用它,但這是數據庫的額外往返1次。 這種方法的好處是代碼可能更易於閱讀/維護。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.