2013-02-01 76 views
1

當我插入一個新的對象到數據庫我把它與另一個關係綁定,通過做另一個數據庫查找,我想刪除這個額外的步驟效率,IE我如何設置一個關係到另一個只使用ID,而不必從數據庫中獲取整個對象?例如:如何做高效插入?

Car C = new Car(); 
C.Person = db.person.find(PersonID); //unnecessary lookup 
//I'd like to do: C.setPersonID(personID); 
db.cars.add(C); 
db.saveChanges(); 

其中型號:

class Car 
{ 
    public virtual Person Person { get; set; } 
} 

回答

2

假設它一比一的關係,你可以這樣做:

public class Car 
{ 
    public int Id { get; set; } 
    public int PersonId { get; set; } 
    public Person Person { get; set; } 
} 

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class CarConfiguration : EntityTypeConfiguration<Car> 
{ 
    public CarConfiguration() 
    { 
     HasKey(i => i.Id); 
     HasRequired(i => i.Person).WithMany().HasForeignKey(i => i.PersonId).WillCascadeOnDelete(false); 
    } 
} 

然後添加一個新的車用個人僅使用該人的身份證,並且還假定具有該身份證的人是現有的:

using (var ctx = new CarContext()) 
{ 
    var car = new Car(); 
    car.PersonId = 5; 
    ctx.Cars.Add(car); 
    ctx.SaveChanges(); 
} 

您可能會感興趣這個link有用。

+0

謝謝,我寧願不改變使用自定義上下文,我只是使用BaseDBContext。所以我喜歡爲ID屬性設置一個Accessor的想法。我想知道我是否可以創建一個方法setPersonID(myID){Person p = new Person; p.id = myId; this.Person = p; } – Baconbeastnz

+0

不確定這是否可能,因爲沒有明確聲明外鍵,您將無法使用Id設置關係。 – cubski

+0

您可以在用於設置Id的Car類上添加SetPersonId(int personId)方法。不確定,但如果這是你的意思。 – cubski

0

使用外鍵並相應地設置外鍵屬性。

0

我還沒有運行這個來確認,但我相信有實體框架使用的基於約定的ID系統。這可能會自動做你不想發生的事情。

class Car 
{ 
    public virtual Person Person { get; set; } 
    public virtual Int32 PersonID { get; set; } 
} 

我會從NerdDinner範例項目,我以前(http://nerddinner.codeplex.com/)看到了這張貼代碼,但你可以看看它,因爲它是相當屬性載貨代碼。