簡體   English   中英

為什么在使用DbSet.Add()時無法添加新創建的主體實體?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM