【问题标题】:Problems when mapping a private property映射私有属性时的问题
【发布时间】:2012-09-25 02:03:57
【问题描述】:

我有两个具有一对多关联的实体类 Project 和 Product:

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) 如果我使用

配置 Project 和 Product 之间的一对多关联
modelBuilder.Entity<Product>.HasRequied(p => p.Project).WithMany(Project.PropertyAccessExpressions.Products);

然后 Project.GetProducts() 失败,似乎延迟加载不起作用。 但是如果我改成

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

然后一切正常。

2)如果我将“Project.Products”属性从protected改为public,那么以上两种方式都可以。

这种情况有什么问题?

【问题讨论】:

  • 您的代码充满了错误。它不编译。
  • 对不起。我在这里粘贴了整个代码。我希望它现在可以工作。

标签: entity-framework code-first private-members


【解决方案1】:

删除GetProducts 并执行以下操作:

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

注意 setter 上的 protected 关键字。我刚刚尝试过,对我来说效果很好。

【讨论】:

    【解决方案2】:

    属性必须是公开的才能让代理工作。见here

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2012-11-23
      • 2020-03-03
      • 2021-11-23
      • 2017-01-19
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多