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に変更すると、上記の両方の方法で問題ありません。
この状況の何が問題になっていますか?