同様の質問
エンティティタイプ<classname>は現在のコンテキストのモデルの一部ではありません-そして-EF4.1コードファーストエラー-エンティティタイプSomeTypeは現在のコンテキストのモデルの一部ではありません同様の質問ですが、「コードファースト」の観点ですのみ、はるかに単純なデータモデルを使用し、接続文字列とマッピングの問題に対処します。これをよく見てください。
症状
// HomeController.cs
public ActionResult Index()
{
var _db = new MealsContext();
var m = _db.Meals.ToList();
var d = _db.Drinks.ToList();
return View();
}
Drinks
コレクションを取得すると例外がスローされます。
The entity type Drink is not part of the model for the current context.
コード
// Meal.cs
public class Meal
{
public int Id { get; set; }
public string Stuff { get; set; }
public virtual ICollection<Meat> Meats { get; set; }
public virtual ICollection<Vegetable> Vegetables { get; set; }
}
// Meat.cs
public class Meat
{
public int Id { get; set; }
public string Name { get; set; }
public int MealId { get; set; }
}
// Vegetable.cs
public class Vegetable
{
public int Id { get; set; }
public string Name { get; set; }
public int MealId { get; set; }
}
// Drink.cs
public class Drink
{
public int Id { get; set; }
public string Name { get; set; }
}
はい、私は現実の世界では、肉と野菜と食事の関係は多対多である可能性が高いことを知っていますが、ここでそれにこだわる必要はありません。
// MealsContext.cs
public class MealsContext: DbContext
{
public MealsContext() : base("ConnectionString")
public DbSet<Meal> Meals{ get; set; }
public DbSet<Meat> Meats{ get; set; }
public DbSet<Vegetable> Vegetables { get; set; }
public DbSet<Drink> Drinks{ get; set; }
}
私の経験は、モデルファーストの方法論を使用したことです。EDMXファイルが作成されてからPOCOが作成されました。
接続文字列には、解析されたEDMXリソースにマップするメタデータセクションがあります(metadata=res://*/Models.MealsModels.csdl|res://*/Models.MealsModels.ssdl|res://*/Models.MealsModels.msl;
)。
EDMXファイルの基礎となるXMLを調べたところ、ConceptualモデルとStoreモデルに存在するすべてのエンティティが示され、すべてが完全にマップされています。WTF?
トラブルシューティング
SSDL
最初に試みたのは、ストアとマッピングEDMXデータ(およびMSL
セクション)を完全に取り除くことでした。発射してください、そして今、2つの例外があります:
Meals
スローを取得してMSL, error 2062 No mapping specified for instance of the EntitySet and AssociationSet in the EntityContainer
います。取得
Drinks
はスローを続けThe entity type Drinkis not part of the model for the current context
ます。
によってスローされるエラーMeals
が予想されます。マッピングとストアモデルを削除しました。調べてみると、_db
- Meals
> InternalSet
->EntitySet
プロパティが正しく、マッピングされていないことがわかります。
によってスローされたエラーDrinks
は、私が立ち往生しているところです。よく調べる_db
と、Drinks
-> InternalSet
->は、エンティティがモデルコンテキストにないことを示す例外をEntitySet
スローすることがわかります。SystemInvalidOperation
EDMXのCSDLはXML形式で次のようになります。
<edmx:ConceptualModels>
<Schema ...>
<EntityContainer Name="MealsContext" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Meals" EntityType="Models.Meal" />
<EntitySet Name="Meats" EntityType="Models.Meat" />
<EntitySet Name="Vegetables" EntityType="Models.Vegetable" />
<EntitySet Name="Drinks" EntityType="Models.Drink" />
<!-- AssociationSets here for the FKs -->
</EntityContainer>
<!-- All are present, but here's the culprit Drink -->
<EntityType Name="Drink">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="Name" Nullable="false" MaxLength="200" FixedLength="false" Unicode="true" />
</EntityType>
<!-- Associations here -->
</Schema>
</edmx:ConceptualModels>
質問
DbContext
にすべてのプロパティがあり、DbSet
CSDLがエンティティタイプを正しく定義しているモデルのメタデータを含む接続文字列を使用している場合、なぜそれがコンテキストの一部ではないのですか?Drink
私が見ることができる唯一の違いDrink
は、それが他のエンティティとは関係がなく、関連付けがないことです...