2012-10-04 87 views
4

時,我有兩個實體類項目和產品有一個一對多的關聯關係:問題映射私有財產

public class Product 
{ 
    public string Id {get; set;} 

    public virtual Project Project {get; set;} 
} 

public class Project 
{ 
    public string Id {get; set;} 
    protected virtual List<Product> Products {get; set;} 

    public ReadOnlyCollection<Product> GetProducts() 
    { 
     return Products.AsReadOnly(); 
    } 

    public class PropertyAccessExpressions 
    { 
     public static Expression<Func<Project, ICollection<Product>>> Products = x => x.Products; 
    } 
} 

public class MyDbContext: DbContext 
{ 
    public MyDbContext(string connectionString): base(connectionString){} 

    public DbSet<Project> Projects {get; set;} 
    public DbSet<Product> Products {get; set;} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //// project.GetProducts() fails for the following configuratin 
     //modelBuilder.Entity<Product>() 
     // .HasRequired(p => p.Project).WithMany(Project.PropertyAccessExpressions.Products); 

     // The following is OK    
     modelBuilder.Entity<Project>() 
      .HasMany(Project.PropertyAccessExpressions.Products).WithRequired(p => p.Project); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var context = new MyDbContext(@"data source=localhost;initial catalog=MyTestDb;integrated security=True;"); 
     context.Database.Delete(); 
     context.Database.Create(); 

     var project1 = new Project { Id = "ProjectId1" }; 
     context.Projects.Add(project1); 
     context.Products.Add(new Product { Id = "ProductId1", Project = project1 }); 
     context.Products.Add(new Product { Id = "ProductId2", Project = project1 }); 
     context.SaveChanges(); 

     var project = context.Projects.ToList()[0];; 
     var products = project.GetProducts().ToList(); 
     Debug.Assert(products.Count == 2); 
    } 
} 

要映射保護財產,我用this solution

但我遇到了以下問題:

1)如果我配置具有

modelBuilder.Entity<Product>.HasRequied(p => p.Project).WithMany(Project.PropertyAccessExpressions.Products); 

然後Project.GetProducts(項目和產品之間的一個一對多的關聯)失敗,似乎懶加載不起作用。 但是,如果我改變

modelBuilder.Entity<Project> 
.HasMany(Project.PropertyAccessExpressions.Products).WithRequired(p => p.Project); 

那麼一切都OK。

2)如果我將屬性「Project.Products」從受保護更改爲public,則上述兩種方式均可。

這種情況怎麼回事?

+0

您的代碼充滿了錯誤。它不會編譯。 –

+0

對不起。我在這裏粘貼了整個代碼。我希望現在能夠運作。 – user1012036

回答

0

必須公開屬性以使代理工作。見here

0

取出GetProducts,只是這樣做:

public virtual List<Product> Products {get; protected set;} 

通知對二傳手的protected關鍵字。我只是試過這個,它對我來說工作得很好。