2010-12-06 152 views
1

我創建了POCO類,它是在EDMX文件當量(類別實體只有一個辦法導航屬性Parent)實體框架4.0更新POCO關係

public class Category { 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public Category Parent {get;set;} 
} 

我必須跟影響家長財產的CRUD操作的問題:

檢索的樣子:

public void CanRetrieve() { 
var category = context.Categories.Where(x => x.ID == id).FirstOrDefault(); 
cotext.LoadProperty<Category> (category, c => c.Parent); 

} 

螞蟻工作正常(我與充滿Parent屬性類別對象)

添加的樣子:

public void CanAdd() { 
    Category cat = new Category(); 
    cat.Name = "cat 1";  
    cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12 
    context.Categories.Attach(cat); 
    context.SaveChanges(); 
} 

還致力於精細

和更新(在DB的新紀錄PARENT_ID字段設置爲12時出現):

public void CanUpdate() { 
    Category cat = new Category(); 
    cat.Name = "cat 1";  
    cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12 
    context.Categories.Attach(cat); 
    //XXX  
    context.SaveChanges() 
} 

做任何事情。如果我用下面的行替換// XXX行:

Context.ObjectStateManager.ChangeObjectState(cat, EntityState.Modified); 

Name屬性的值更新形式源對象(我想其他的標量屬性也將是),但家長被忽略,PARENT_ID場在基地保存。

我的問題是:如何在這種情況下我可以告訴上下文我希望Parent屬性值也反映到數據庫,並且可以在不傳遞Parent屬性的所有值的情況下完成(只有一個ID,就像在Add情況)?

最好的問候,

安傑

回答

0

你真的確定你CanAdd代碼真的有效?您將兩個新對象附加到上下文,這意味着它們處於未更改狀態。通過調用SaveChanges,它們不應該被插入。如果使用AddObject而不是Attach,則新類別和父類別都將設置爲已添加狀態,並且兩者都將插入到SaveChanges中。

您的CanUpdate方法不起作用,因爲您只是將更新的類別設置爲已修改狀態,但您已附加三個對象 - 類別,父類別及其之間的關係。你也必須改變關係的狀態。

+0

你說得對,我在急匆匆地砍了代碼,所以我不小心把Attach而不是AddObject添加到CanAdd方法中。對不起,誤導了。 至於CanUpdate,正如我所理解的,我無法將關係狀態設置爲Modified,doeas意味着在我的場景中,我必須刪除舊關係(將其更改爲Deleted),然後將新的Parent實體和關係設置爲Added)? – AndrzejD 2010-12-06 14:22:20

0

不幸的是,我不得不添加ParentId(或任何名稱的列)屬性,使其工作。我知道這很糟糕,但我沒有找到其他方式。

因此,更改屬性並將父屬性設爲null,將實例附加到上下文,將其標記爲已修改並調用SaveChanges();就是這樣。

IMO,這應該由EF解決。我使用EntityTypeConfiguration爲每個類< - >表映射爲了保持數據庫和類標準不變,所以它應該直截了當地知道我標記爲主鍵是什麼EF必須使用。