SomeEntityのDbSetを含む場合と含まない場合がある複数のDbContextを操作している可能性がある状況があります。
当然、SaveChangesを起動し、このエンティティが存在しない場合、次のエラーが発生します。
エンティティタイプSomeEntityは、現在のコンテキストのモデルの一部ではありません。
エンティティまたはエンティティセットがモデルに存在するかどうかを確認し、存在しない場合はコードの問題のあるビットを短絡するにはどうすればよいですか?
リチャード
SomeEntityのDbSetを含む場合と含まない場合がある複数のDbContextを操作している可能性がある状況があります。
当然、SaveChangesを起動し、このエンティティが存在しない場合、次のエラーが発生します。
エンティティタイプSomeEntityは、現在のコンテキストのモデルの一部ではありません。
エンティティまたはエンティティセットがモデルに存在するかどうかを確認し、存在しない場合はコードの問題のあるビットを短絡するにはどうすればよいですか?
リチャード
呼び出すとすぐに例外がスローされるSet<NotMappedEntityType>
ため、最も簡単な方法は、例外をキャッチして必要に応じて処理することです。
複雑なソリューションでは、マッピングメタデータを参照し、CLRタイプと同じ名前である必要があるマップされたエンティティタイプを検索する必要があります。派生コンテキストクラスにこのメソッドを追加して、エンティティタイプの存在を確認できます。
public bool Exists<TEntity>() where TEntity : class
{
string entityName = typeof(TEntity).Name;
ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
MetadataWorkspace workspace = objContext.MetadataWorkspace;
return workspace.GetItems<EntityType>(DataSpace.CSpace).Any(e => e.Name == entityName);
}
EF Core 2.x更新された拡張メソッド:存在しない場合はNotFoundを返し、エンティティTEntityがモデルで定義されている場合はDbSetTypeまたはViewTypeを返します。
public enum QueryType
{
DbsetType,
ViewType,
NotFound
}
public static class DbContextExtensions
{
public static QueryType GetQueryType<TEntity>(this DbContext context) where TEntity : class
{
var metaData = context.Model.FindEntityType(typeof(TEntity));
if (metaData == null)
return QueryType.NotFound;
return metaData.IsQueryType ? QueryType.ViewType : QueryType.DbsetType;
}
}
これは私の単純化された答えです:
public partial class MyDbContext : DbContext
{
public bool Exists<Tx>() where Tx : class
{
var attachedEntity = this.ChangeTracker.Entries<Tx>().FirstOrDefault();
return (attachedEntity != null);
}
}
私は次の実装を頻繁に使用しました。
(このメソッドは、コンテキストクラスによって実装されている別のインターフェイスで宣言しました。)
public bool EntitySetExists<T>(T entity) where T : class
{
return this.Set<T>().Local.Any(e => e == entity);
}
「Any()」拡張メソッドについて不平を言っている場合は、単に「usingSystem.Linq;」に固執してください。行方不明の場合。