4

1対多の関連付けを持つ2つのエンティティクラス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);
    }
}

保護されたプロパティをマップするには、このソリューションを使用します。

しかし、私は次の問題に遭遇しました:

1)プロジェクトと製品の間に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」をprotectedからpublicに変更すると、上記の両方の方法で問題ありません。

この状況の何が問題になっていますか?

4

2 に答える 2

0

を削除してGetProducts、これを行うだけです:

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

protectedセッターのキーワードに注意してください。私はちょうどこれを試してみましたが、うまくいきました。

于 2013-03-17T15:56:24.467 に答える
0

プロキシが機能するには、プロパティが公開されている必要があります。こちらをご覧ください

于 2013-03-17T15:25:44.263 に答える