これはおそらく私が長い間解決に時間を費やしてきた時間の無駄の最大の問題です。
var db = new hublisherEntities();
establishment_brands est = new establishment_brands();
est.brand_id = 1;
est.establishment_id = 1;
est.price = collection["price"];
est.size = collection["size"];
db.establishment_brands.Add(est);
db.SaveChanges();
これは私にエラーを与える
値をnullにすることはできません。パラメータ名:source
のスタックトレース
[ArgumentNullException:値をnullにすることはできません。パラメーター名:source] System.Linq.Enumerable.Any(IEnumerable
1 source, Func
2述語)
System.Data.Entity.Internal.InternalContext.SaveChanges()+193
System.Data.Entity.Internal.LazyInternalContext.SaveChanges()+33
System.Data.Entity.DbContext.SaveChanges()+20 ... ...
テーブルにエンティティを追加したいだけです。 ORMはEFです。
私はしばらく前にこれを持っていました、そして答えは必ずしもあなたが期待していたものではないです。このエラーメッセージは、接続文字列が正しくない場合によく発生します。
たぶん、あなたはこのようなものが必要になるでしょう:
<connectionStrings>
<add name="hublisherEntities" connectionString="Data Source=localhost;Initial Catalog=hublisher;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=localhost;Initial Catalog=hublisher;Integrated Security=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
何が起きているのかというと、間違った場所にあるデータソースを探しているということです。 Entity Frameworkはそれをわずかに異なるように指定します。あなたがあなたの接続文字列とEF設定を投稿するならば、我々はチェックすることができます。
DbContext内のどこかにIEnumerable
という値があり、Any()
(またはWhere()
またはSelect()
またはその他のLINQメソッド)で照会されていますが、この値はnull
です。
LINQメソッドを使用している場所、またはNULLとしてパラメータとしてIEnumerable
を使用している場所にクエリを(コード例の外側のどこかに)まとめたかどうかを調べます。
私の理由はここでの他の部分とは異なっていたので、私はこの問題を抱えているかもしれない他の人のためにそれを投稿しようと思った。
私はnullのフィルタでDbSetのインスタンスでCountを呼び出していました。
dbSet.Count(null);
ここでnullを渡すとエラーが発生することがわかったので、フィルタがnullの場合はパラメータなしのメソッドを呼び出します。
if (filter == null)
{
return dbSet.Count();
}
else
{
return dbSet.Count(filter);
}
これは私にとって問題を分類しました。これは、DbSetの他のメソッドにとっても問題になる可能性があります。
fYIと同じように、誰かが便利だと思うかもしれません。私は2日近くこのエラーを追いかけていて、いつも何か大きなことを考えていて問題になっている可能性のあるクラスを探していました。そしてついに私はそれがmypage.ascxのマークアップ(HTML)コードになりました。 。問題は私が<asp:EntityDataSource>
を持っていて、これがincludeプロパティを持っていて、ここに他のいくつかのテーブルがリストされていて誤ってデータベースから最近削除されたテーブルがあったことです。私はインクルードリストからバカテーブルを削除したところです。これが誰かに役立つことを願っています。
他の誰かがDB First Entity Frameworkの設定に関する私の問題でここで終わる場合に備えて。
結局、接続文字列を受け入れるにはEntitiesコンストラクタをオーバーロードする必要がありました。その理由は、App.configからそれを魔法のように取得するのではなく、Appsettings.jsonから接続文字列を取得するAsp.Net Core依存性注入コンテナを使用できるためパラメータのないコンストラクタを呼び出すときのファイル.
新しいオーバーロードで自分のDbSetを初期化するための呼び出しを追加するのを忘れていました。そのため、自動生成されたパラメータなしのコンストラクタは次のようになりました。
public MyEntities()
: base("name=MyEntity")
{
Set1 = Set<MyDbSet1>();
Set2 = Set<MyDbSet2>();
}
そして私の新しいオーバーロードはこのように見えました:
public MyEntities(string connectionString)
: base(connectionString)
{
}
解決策は、自動生成されたコードが処理する初期化子を追加することです。
public MyEntities(string connectionString)
: base(connectionString)
{
Set1 = Set<MyDbSet1>();
Set2 = Set<MyDbSet2>();
}
DbContextを使ったRespository内のいくつかの呼び出し(これらの初期化されたDBSetを必要としないもの)はうまく機能し、他のものはOPに記述されているランタイムエラーを投げるので、これは本当に私をループに投げました。
次の解決策で解決しました
サービスのコンストラクタにリポジトリを注入していることを確認してください。それは私のためにそれを解決しました。 ::額を打つ::
データベース内のRowを取り、この "NULL"のようにその行内のすべてのカラムをnullにします。
MVCでは、View画面はControllerまたはRepository.csにあるメソッドを呼び出し、CSHTML内の任意のコントロールに戻り値を割り当てていますが、そのメソッドは実際には.cs/controllerには実装されていません
これは問題の2013年からは遠い道のりですが、ASP.NET 5アプリをASP.NET Coreに移行してからにアップグレードしようとしたときに遅延読み込みが有効になっていないと、この症状が現れることがあります。 EF 6以降のEntity Framework Core 2.x。 Entity Framework Coreは、遅延読み込みのプロキシサポートを別のパッケージに移動しました したがって、インストールする必要があります。
これは、ロードしたものがEntity Framework Core Sql Serverパッケージ(Entity Frameworkを正常に起動させる)だけである場合に特に当てはまります。
Proxiesパッケージをインストールした後、docsが言うように、DbContext optionsビルダー(Startup DI setupセクション、またはDbContextを設定する場所)で.UseLazyLoadingProxies()
を呼び出すと、上記の例外をスローしていたナビゲーションプロパティがそれをスローしなくなりますそして、以前のEntity Framework 6として機能します。
RazorビューでSubChildEntitiesを呼び出そうとしたときに、Controllerアクションの親の.Include(c => c.SubChildEntities)に.ThenInclude(s => s.SubChildEntities)を追加し忘れていました。
var <parent> = await _context.Parent
.Include(c => c.<ChildEntities>)
.ThenInclude(s => s.<SubChildEntities>)
.SingleOrDefaultAsync(m => m.Id == id);
Visual Studio 2017コミュニティのIntelliSenseは、.ThenInclude()のラムダ式でSubChildEntitiesオブジェクトを取得しないことに注意してください。ただし、コンパイルと実行は正常に行われます。
私の場合のように、savechangesがbcozをエラーにしていたのと同じくらい愚かなことがあり、データベースに外部キーがなく、EDMテーブルに関連付けが追加されました。 dbに外部キーを追加し、修正のためにEDMを再生成しました。
私が見ていたエラーは次のとおりです。ケース1 - > EDMにDBContextを使用している場合Message = Valueをnullにすることはできません。パラメータ名:System.Linq.Enumerable.Any [TSource]のソース(IEnumerable1 source, Func
2述語)
ケース2 - > EDMにObjectContextを使用している場合Message = EntitySet 'Contact'にDefiningQueryがあり、現在の操作をサポートする要素が存在しないため、更新できません。
(それが誰かに役立つ場合に備えてそれをそこに投げたかっただけです)。
エンティティプロパティに無効なTypeがあると、このエラーが発生しました。
public Type ObjectType {get;set;}
プロパティを削除すると、エラーは発生しなくなりました。
私の場合は、IISでWebアプリケーションを設定しているときに問題が発生しました。どのレコードに対してもupdateコマンドが実行されると、このエラーが発生しました。
読み取り専用に設定されているApp_Dataのアクセス許可の問題です。フォルダを右クリックし、[読み取り専用]チェックボックスをオフにすれば完了です。ちなみに、テスト目的で、私はApp_Dataフォルダーにあるlocaldbデータベースを使用していました。
DbContext
にset;
がないので、.Net Core 2.2 Entity Frameworkでこのようなエラーが発生しました。
public DbSet<Account> Account { get; }
に変更されました:
public DbSet<Account> Account { get; set;}
しかし、Where()
とSelect()
を使ってlinqクエリを使おうとするまでは例外は表示されませんでした。
DbSet
を読み取り専用に設定しようとしました。私は頑張ります...