2

この問題を解決するのを手伝ってください。私はすでに2日間座っていましたが、どこが間違っているのかわかりませんでした。私は以下のこの記事を見ました:

しかし、私は自分の問題を解決していないので、ついにこれを尋ねます。以下は私の完全なクラスなので、問題を再現できます。

Movie実在物

public class Movie
{
    public Movie()
    {
        this.MovieCategoryList = new List<Movie_Category>();
    }
    public string MovieID { get; set; }
    public string MovieName { get; set; }
    public Nullable<int> YearReleased { get; set; }
    public virtual ICollection<Movie_Category> MovieCategoryList { get; set; }
}

public class MovieMap : EntityTypeConfiguration<Movie>
{
    public MovieMap()
    {
        // Primary Key
        this.HasKey(p => p.MovieID);

        // Property
        this.Property(p => p.MovieID)
            .IsRequired()
            .HasMaxLength(15);

        this.Property(p => p.MovieName)
            .IsRequired()
            .HasMaxLength(50);

        this.Property(p => p.YearReleased)
            .IsOptional();

        // Table and Column Mappings
        this.ToTable("Movie");
        this.Property(p => p.MovieID).HasColumnName("MovieID");
        this.Property(p => p.MovieName).HasColumnName("MovieName");
        this.Property(p => p.YearReleased).HasColumnName("YearReleased");

        // Relationships
    }

Category実在物

public class Category
{
    public Category()
    {
        this.MovieCategoryList = new List<Movie_Category>();
    }
    public string CategoryID { get; set; }
    public string CategoryName { get; set; }
    public virtual ICollection<Movie_Category> MovieCategoryList { get; set; }
}

public class CategoryMap : EntityTypeConfiguration<Category>
{
    public CategoryMap()
    {
        // Primary Key
        this.HasKey(p => p.CategoryID);

        // Property
        this.Property(p => p.CategoryID)
            .IsRequired()
            .HasMaxLength(15);

        this.Property(p => p.CategoryName)
            .IsRequired()
            .HasMaxLength(30);

        // Mappings
        this.ToTable("Category");
        this.Property(p => p.CategoryID).HasColumnName("CategoryID");
        this.Property(p => p.CategoryName).HasColumnName("CategoryName");

    }
}

関係であるため、Movie_CategoryどちらにマップMovieされますかCategoryMany-to-Many

public class Movie_Category
{
    public int MovieCategoryID { get; set; }
    public string MovieID { get; set; }
    public string CategoryID { get; set; }

    public virtual Movie Movie { get; set; }
    public virtual Category Category { get; set; }
}

public class Movie_Category_Map : EntityTypeConfiguration<Movie_Category>
{
    public Movie_Category_Map()
    {
        // Primary Key
        this.HasKey(p => p.MovieCategoryID);

        // Property
        this.Property(p => p.MovieCategoryID)
            .IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        this.Property(p => p.CategoryID)
            .IsRequired()
            .HasMaxLength(15);

        this.Property(p => p.MovieID)
            .IsRequired()
            .HasMaxLength(15);

        // Mappings
        this.ToTable("Movie_Category");
        this.Property(p => p.MovieCategoryID).HasColumnName("RecordID");
        this.Property(p => p.MovieID).HasColumnName("MovieID");
        this.Property(p => p.CategoryID).HasColumnName("CategoryID");

        // Relationship
        this.HasRequired(t => t.Category)
            .WithMany(t => t.MovieCategoryList)
            .HasForeignKey(p => p.CategoryID);

        this.HasRequired(t => t.Movie)
            .WithMany(t => t.MovieCategoryList)
            .HasForeignKey(p => p.MovieID);

    }
}

MovieShopContextから継承しますDbContext

public class MovieShopContext : DbContext
{
    public DbSet<Movie> MovieList { get; set; }
    public DbSet<Category> CategoryList { get; set; }
    public DbSet<Movie_Category_Map> MovieCategory { get; set; }

    static MovieShopContext()
    {
        Database.SetInitializer<MovieShopContext>(null);
    }

    public MovieShopContext()
        : base(@"Data Source=Newbie;Initial Catalog=SampleDB;Integrated Security=True;")
    { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Configurations.Add(new MovieMap());
        modelBuilder.Configurations.Add(new CategoryMap());
        modelBuilder.Configurations.Add(new Movie_Category_Map());
    }
}

だから私の中Data Access Layerで、私はこのコードを持っています:私はtry-catchブロックを削除しました

using (MovieShopContext _db = new MovieShopContext())
{
    Movie _movie = new Movie();
    _movie.MovieID = "M-1212-001";
    _movie.MovieName = "Book of Riddles";
    _movie.YearReleased = 2001;

    _db.MovieList.Add(_movie);  // stops here

    _db.SaveChanges();
    MessageBox.Show("Action Completed!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

コードを実行しようとすると、オンラインで停止します

_db.MovieList.Add(_movie);

そして、この例外メッセージをスローします、

モデルの生成中に1つ以上の検証エラーが検出されました。

\ tSystem.Data.Entity.Edm.EdmEntityType::EntityType'Movie_Category_Map'にはキーが定義されていません。このEntityTypeのキーを定義します。

\ tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet'MovieCategory'は、キーが定義されていないタイプ'Movie_Category_Map'に基づいています。

私の知る限り、Movie_Category_Map構成では、すでに主キーを設定していますが、

this.HasKey(p => p.MovieCategoryID);

どこで間違ったことをしたのか教えてもらえますか?または私はどこに行方不明ですか?

4

1 に答える 1

3
public DbSet<Movie_Category_Map> MovieCategory { get; set; }

この行はあなたに問題を引き起こしています

これはあるべきです

public DbSet<Movie_Category> MovieCategory { get; set; }

エンティティとして EntityTypeConfiguration を追加しているため、キーを求めています (もちろん存在しません)。

于 2012-12-24T06:40:41.053 に答える