2013-05-15 124 views
1

使用Code FirstEF 5.0我有以下內容:如何強制實體框架映射「內部」導航屬性?

internal class Entities : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Project> Projects { get; set; } 
} 

// User class which holds a list of 'Project' class 
public class User 
{ 
    private List<Project> _projects = new List<Project>(); 

    public int Id { get; set; } 
    internal List<Project> Projects 
    { 
     get { return _projects; } 
     set { _projects = value; } 
    } 
} 

// Project class which holds a list of 'Milestone' class 
public class Project 
{ 
    private List<Milestone> _milestones = new List<Milestone>(); 

    public int Id { get; set; } 
    public string Title { get; set; } 
    internal List<Milestone> MileStones 
    { 
     get { return _milestones; } 
     set { _milestones = value; } 
    } 
} 

雖然EF已經創建的表和關係正確(一到多爲:用戶=>項目=>里程碑),如果我創建了一個用戶的一些項目並將其添加到DbContext,只有用戶將被添加到和他的項目不會。具有里程碑項目的用戶也是如此。我做這樣說:

public void AddUser(User user) 
{ 
    using (var repository = new Entities()) 
    { 
     repository.Users.Add(user); 
     repository.SaveChanges(); 
    } 
} 

我的問題是如何強制EF自動(級聯)插入或更新複雜的實體,因此將隨着項目列表的用戶,在中插入USERS表用戶和他在PROJECTS表中的項目會自動(正確的關係)?

EF它聰明在第5版或我應該手動做?

+0

您是否嘗試過將setter設置爲'private'? – Justin

+0

@Justin:這是行不通的。儘管我願意,我甚至將其設置爲「public IReadOnlyList」和「public IReadOnlyCollection」,但是「EF」拒絕映射只讀屬性。 – Xaqron

+0

您可以將它們公開並更改get/set以包含驗證邏輯嗎? – Justin

回答

1

不用擔心,EF足夠聰明,但是當它們的訪問設置爲internal時,它將無法添加導航屬性。讓他們public和您的項目/里程碑將被添加。

// User class 
public List<Project> Projects 
{ 
    get { return _projects; } 
    set { _projects = value; } 
} 

// Project class 
public List<Milestone> MileStones 
{ 
    get { return _milestones; } 
    set { _milestones = value; } 
} 

另外,如果您想啓用導航屬性延遲加載你也需要讓他們public virtual爲EF內部具有使代理爲你的模型類。

+0

他們是'internal'的原因是:我需要在添加/刪除項目/里程碑之前進行一些檢查,以便隱藏列表併爲此提供兩個功能(AddProject/RemoveProject),(AddMilestone/RemoveMilestone)。有什麼方法可以讓'EF'做'公開'的工作嗎? – Xaqron

+0

我不這麼認爲,EF將需要訪問這些設置/獲取您的導航屬性時檢索/更新數據庫。 –

+0

由於代碼引用「EF」,EF可以訪問它們。但是我需要將這些列表從直接更改中隱藏起來,並提供一些訪問它們的方法。是否有任何'數據註解'強制'EF'認爲他們是'公共'?事實上,我應該讓他們'私人',但由於某種原因使他們'內部'。 – Xaqron

4
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().HasMany(x => x.Projects); 
} 
+0

這給了你在哪裏尋找? – Justin

+0

@Justin:是的。這工作正常,不需要'內部'到'公共'。 – Xaqron

1

您可以通過設置「保護內部的」你「列出項目」和「列表里程碑」性質也達到預期的效果。這樣EF可以處理它們。 EF將使用代理類包裝器覆蓋這些屬性,並且您還將擁有延遲加載功能。