この問題を解決するのを手伝ってください。私はすでに2日間座っていましたが、どこが間違っているのかわかりませんでした。私は以下のこの記事を見ました:
- EntityType'MyProfile'にはキーが定義されていません。このEntityTypeのキーを定義します
- https://stackoverflow.com/questions/5011145/entity-framework-code-first-entitytype-has-no-key-define
- EntityType'ApplicantPosition'にはキーが定義されていません
- EntityFrameworkCode-First-このEntityTypeのキーを定義します
- EntityType'SelectListItem'にはキーが定義されていません
しかし、私は自分の問題を解決していないので、ついにこれを尋ねます。以下は私の完全なクラスなので、問題を再現できます。
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
されますかCategory
Many-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);
どこで間違ったことをしたのか教えてもらえますか?または私はどこに行方不明ですか?