値をnullにすることはできません。パラメータ名:ソース


129

これはおそらく私が長い間解決に時間を費やしてきた時間の最大の無駄の問題です。

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にすることはできません。パラメータ名:ソース

のスタックトレース

[ArgumentNullException:値をnullにすることはできません。パラメーター名:ソース] System.Linq.Enumerable.Any(IEnumerable 1 source, Func2述語)+4083335 System.Data.Entity.Internal.InternalContext.WrapUpdateException(UpdateException updateException)+87
System.Data.Entity.Internal.InternalContext.SaveChanges()+ 193
System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
+ 33 System.Data.Entity.DbContext.SaveChanges()+20 ... ...

テーブルにエンティティを追加したいだけです。ORMはEFです。


7
例外メッセージは説明ではありませんか?ヌルにすることのできない何かがヌルです。あなたのdbスキーマは何ですか?
Ash Burlaczenko 2013

:あなたはこの質問とその答えの中に見たいと思うかもしれませんstackoverflow.com/questions/3244336/...
ヴィルサロネン

1
おそらくcollectinのエントリの1つがnull値を持っています:est.price = collection ["price"]; est.size = collection ["size"];
MikeTWebb 2013

1
@AshBurlaczenkoおお、あなたは思いますか?私のスキーマは、すべての列がnullになる可能性があるようです。
danielovich

2
接続文字列を投稿できますか?
anaximander

回答:


42

私はしばらく前にこれを持っていましたが、答えは必ずしもあなたが期待するものではありません。このエラーメッセージは、接続文字列が間違っている場合によく表示されます。

おそらく、次のようなものが必要です。

<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構成を投稿すると、確認できます。


2
私の場合、コード内の誤った接続文字列でしたが、それでも接続文字列の問題がありました。
jleach

190

DbContext内のどこかに(または、または他のLINQメソッドで)IEnumerableクエリされる値ですが、この値はです。Any()Where()Select()null

LINQメソッドを使用しているクエリ(例のコードの外のどこか)を組み合わせたか、またはIEnumerableNULLのパラメーターとしてを使用したかを確認します。


7
これは私に問題を解決しました、これはOPの解決策でもあると思われますが、受け入れられた答えは異なります。
NibblyPig 2014年

4
私の答えは、フィルタリングしようとしたリストをまだ初期化していないという.Where()ことでした-それはまだnullです。
ブライアンレイシー

1
この種のnullエラーを回避するには、IEnumerableプロパティにデフォルト値を設定するか、Any()でテストする必要があります
Fer R

1
この回答は、他のはるかに低い評価の回答を下回る140以上の賛成投票でどうですか
nldev

1
受け入れられた回答ではないため、この回答は低くなります。最初の答えはおそらくオリジナルのポスターに対する正しい答えでした。この答えはおそらく他の多くの人々にとって正しい答えでした。
Martin Mulder

11

私の理由はここの他の部分とは異なっていたので、この問題が発生する可能性のある他の人に投稿したいと思いました。

私はnullのフィルターを使用してDbSetのインスタンスでCountを呼び出していました

dbSet.Count(null);

ここでnullを渡すとエラーが発生することがわかったので、フィルターがnullの場合はパラメーターなしのメソッドを呼び出します。

 if (filter == null)
 {
     return dbSet.Count();
 }
 else
 {
     return dbSet.Count(filter);
 }

これは私のために問題を分類しました。これは、DbSetの他のメソッドでも問題になる可能性があります。


9

私は持っていなかったので、私はちょうどネットコア2.2 Entity Frameworkの中で、この正確なエラーを得たset;私にDbContextそうように:

public DbSet<Account> Account { get; }

に変更:

public DbSet<Account> Account { get; set;}

しかし、それは私がLINQクエリを使用しようとするまで、例外は認められなかったWhere()Select()他人として上記していました。

DbSet読み取り専用に設定しようとしました。頑張ります...


1
Linqpadでアセンブリを使用しようとしているときに、この正確な問題が発生しました。このおかげで、私はもっと多くの時間を無駄にすることができたでしょう。.Net Core 3.1 / EF Core 3.1はこちら。
日曜日

3

参考までに、誰かがそれを役に立つと思うかもしれません。私はこのエラーを約2日間追跡し、常に何か大きなことを考えていて、問題である可能性のあるクラスを探していましたが、最終的に非常に愚かな問題であり、mypage.ascxのマークアップ(HTML)コードにありました。問題は、私が持っていて<asp:EntityDataSource>、これにincludeプロパティがあり、他のいくつかのテーブルがここにリストされていて、誤って最近データベースから削除されたテーブルがあり、気付かなかったため、他のエンティティでnullを返していました。インクルードリストから愚かなテーブルを削除したところです。これが誰かに役立つことを願っています。


2

他の誰かがここでDB First Entity Frameworkのセットアップで私の問題に終わった場合に備えて。

要するに、Entitiesコンストラクタをオーバーロードして接続文字列を受け入れる必要がありました。その理由は、App.configから魔法のように取得するのではなく、Asp.Net Core依存関係注入コンテナを使用してappsettings.jsonから接続文字列を取得できるためです。パラメータなしのコンストラクタを呼び出すときのファイル。

新しいオーバーロードで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で説明されているランタイムエラーをスローするため、これは本当にループの原因となりました。


1

リポジトリをサービスのコンストラクターに注入していることを確認してください。それで解決しました。::おでこ額::


1

この例外は、nullコレクションの値をカウントしようとすると返されます。

たとえば、以下はErrorsがnullでない場合に機能しますが、Errorsがnullの場合、Valueを nullにすることはできません。パラメータ名:ソース例外が発生します。

if (graphQLResponse.Errors.Count() > 0)

この例外は、代わりにnullをチェックすることで回避できます。

if (graphQLResponse.Errors != null)

1

次の解決策で解決しました

  1. edmxファイルを右クリックし、XMLエディターで開くを選択します。
  2. edmx:StorageModels要素内のエンティティを見つけます
  3. DefiningQuery完全に取り除く
  4. の名前store:Schema="dbo"を変更しますSchema="dbo"(存在する場合)
  5. store:Nameプロパティを削除します

Schema = "dbo"からSchema = "dbo"へ-何ですか?
Vincent Buscarello

0

これは、savechangesがbcozにエラーを出力した私の場合のようにばかげている可能性があります。dbに外部キーがなく、関連付けがEDMテーブルに追加されました。DBに外部キーを追加し、修正のためにEDMを再生成しました。

私が見たエラーは次のとおりです。ケース1-> EDMにDBContextを使用する場合Message = Valueをnullにすることはできません。パラメーター名:System.Linq.Enumerable.Any [TSource]のソース(IEnumerable 1 source, Func2述語)

ケース2-> EDMにObjectContextを使用する場合Message = EntitySet 'Contact'を更新できません。これにはDefiningQueryがあり、現在の操作をサポートする要素が要素に存在しないためです。

(誰かを助けるためにそこにそれを投げたかっただけです)。


0

MVCでは、View画面がControllerまたはRepository.csにあるメソッドを呼び出し、CSHTMLの任意のコントロールに戻り値を割り当てていますが、そのメソッドは実際には.cs / controllerに実装されていないため、CSHTMLはNULLパラメーター例外をスローします


0

エンティティプロパティに無効なタイプがあると、このエラーが発生しました。

public Type ObjectType {get;set;}

プロパティを削除すると、エラーが発生しなくなりました。


0

私の場合、IISでWebアプリケーションを構成しているときに問題が発生しました。レコードで更新コマンドが実行されると、このエラーが生成されました。

これは、読み取り専用に設定されたApp_Dataの権限の問題でした。フォルダを右クリックし、[読み取り専用]チェックボックスをオフにすると完了です。ちなみに、テストの目的で、App_Dataフォルダーにあるlocaldbデータベースを使用していました。


0

RazorビューでSubChildEntitiesを呼び出そうとしたときに、.ThenInclude(s => s.SubChildEntities)を親.Include(c => c.SubChildEntities)にコントローラーアクションに追加するのを忘れていたのが私の間違いです。

var <parent> = await _context.Parent
            .Include(c => c.<ChildEntities>)
            .ThenInclude(s => s.<SubChildEntities>)
            .SingleOrDefaultAsync(m => m.Id == id);

Visual Studio 2017 CommunityのIntelliSenseは、.ThenInclude()のラムダ式のSubChildEntitiesオブジェクトを取得しないことに注意してください。ただし、コンパイルと実行は成功します。


0

これは質問の2013年から長い道のりですが、ASP.NET 5アプリをASP.NET Coreに移行するときに遅延読み込みを有効にせずにアップグレードしようとすると、この症状が現れることがありますEntity Framework Core 2.x(EF 6以降)。Entity Framework Coreは、遅延読み込みプロキシサポートを別のパッケージに移動したため、インストールする必要があります。

これは、ロードしたものがEntity Framework Core Sql Serverパッケージ(Entity Frameworkを正常にオンにする)である場合に特に当てはまります。

プロキシパッケージをインストールした後、ドキュメントにあるよう.UseLazyLoadingProxies()に、DbContextオプションビルダー(スタートアップDIセットアップセクション、またはDbContextを構成する場所)を呼び出すと、上記の例外をスローしていたナビゲーションプロパティはスローしなくなります。 Entity Framework 6が以前と同じように動作します。


私はこの道を始め、いくつかのシナリオではそれがうまくいくかもしれないが、私はかなり迅速にこれに走ったstackoverflow.com/questions/41881169/...
infocyde

0

XUnitでも同じ問題が発生しました。問題は私のデータベース接続にありました。接続文字列が正しいかどうかを確認してください。


0

そして、私の場合、2つの異なる列を、以下のようなDbContext構成のIDとして誤って定義しています。

builder.HasKey(e => e.HistoryId).HasName("HistoryId");
builder.Property(e => e.Id).UseSqlServerIdentityColumn(); //History Id should use identity column in this example

以下のように修正すると、

builder.HasKey(e => e.HistoryId).HasName("HistoryId");
builder.Property(e => e.HistoryId).UseSqlServerIdentityColumn();

このエラーも解消しました。


-3

データベースの行を取得し、この「NULL」のようにその行のすべての列をnullにします。今度は、try catchまたはその他の場合にそのNULL値を渡します。


これはひどい考えです
Jason Loki Smith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.