1

カテゴリとプロジェクトの間に1対多の関係を定義しようとしています(カテゴリには1つまたは複数のプロジェクトを含めることができ、プロジェクトには1つまたはまったくカテゴリを含めることができません)

public class Project : Entity {

    public virtual string Title { get; set; }

    public virtual Guid? CategoryId { get; set; }
    public virtual Category Category { get; set; }
}

public class Category : Entity {       
    public virtual string Name { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
}

次のマッピングを定義しました。

            modelBuilder.Entity<Project>()
            .MapSingleType(p => new {
                ProjectId = p.Id,
                p.CategoryId,
                p.Title,
                p.Slug,
                p.ShortDescription,
                p.Description,
                p.CreatedOn,
                p.UpdatedOn
            })
            .ToTable("Projects");

        modelBuilder.Entity<Category>()
            .MapSingleType(c => new {
                CategoryId = c.Id,
                c.Name,
                c.CreatedOn,
                c.UpdatedOn
            })
            .ToTable("Categories");

        // relationships
        modelBuilder.Entity<Project>()
            .HasOptional<Category>(p => p.Category)
            .WithMany()
            .HasConstraint((p, c) => p.CategoryId == c.Id);

これは正常に機能しているように見えますが、EFはCategories_Productsテーブルを生成しています(多対多の関連付けに使用されます)。

デフォルトのデータベース初期化子を無効にしましたが、このテーブルはまだ生成されています。私は何が間違っているのですか?

ありがとうベン

4

1 に答える 1

0

プロジェクトとカテゴリのマッピングコードを削除し、EFにデフォルトの規則を使用してデータベースを作成させました。これにより、私が期待した関係が生まれました(カテゴリとプロジェクトの間に1対多)。

マッピングを明示的に定義した唯一の理由は、EFが基本クラスをうまく処理していないように見えるためだと付け加えておきます。すべてのエンティティが継承する単一のプロパティ「Id」を持つ基本クラス「Entity」がありました。これにより、CTP4で非常に多くの問題が発生したため、インターフェイスIEntityと交換しただけです。これでも、汎用リポジトリクラスを操作するときに必要な制約がありました。

うまくいけば、エンティティ基本クラスはRTMでより適切にサポートされます

于 2010-11-16T09:13:40.923 に答える