Nilai tidak boleh nol. Nama parameter: sumber

129

Ini mungkin masalah pemborosan waktu terbesar yang telah saya habiskan berjam-jam untuk memecahkannya dalam waktu yang lama.

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();

Ini memberi saya kesalahan

Nilai tidak boleh nol. Nama parameter: sumber

stacktrace dari

[ArgumentNullException: Nilai tidak boleh nol. Nama parameter: sumber] System.Linq.Enumerable.Any (IEnumerable 1 source, Func2 predicate) +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 ... ...

Saya hanya ingin menambahkan entitas ke tabel. ORM adalah EF.

danielovich
sumber
7
Bukankah pesan pengecualian sudah menjelaskan? Sesuatu adalah null yang tidak bisa null Apa skema db Anda?
Ash Burlaczenko
Anda mungkin ingin melihat pertanyaan ini dan jawabannya: stackoverflow.com/questions/3244336/…
Ville Salonen
1
Mungkin salah satu entri di collectin memiliki nilai nol: est.price = collection ["price"]; est.size = koleksi ["size"];
MikeTWebb
1
@AshBurlaczenko oh, menurutmu? Skema saya sepertinya setiap kolom bisa nol.
danielovich
2
Bisakah Anda memposting string koneksi Anda?
anaximander

Jawaban:

42

Saya punya yang ini beberapa waktu lalu, dan jawabannya belum tentu seperti yang Anda harapkan. Pesan kesalahan ini sering muncul ketika string koneksi Anda salah.

Dengan tebakan, Anda memerlukan sesuatu seperti ini:

<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>

Apa yang terjadi adalah mencari sumber data di tempat yang salah; Entity Framework menetapkannya sedikit berbeda. Jika Anda memposting string koneksi dan konfigurasi EF maka kami dapat memeriksanya.

anaximander
sumber
2
Dalam kasus saya itu adalah string konipsi yang salah dalam kode, tetapi tetap saja masalah string koneksi.
jleach
190

Di suatu tempat di dalam DbContext adalah nilai yang IEnumerableditanyakan Any()(atau Where()atau Select()metode LINQ lainnya), tetapi nilai ini adalah null.

Cari tahu apakah Anda menempatkan kueri bersama-sama (di suatu tempat di luar kode contoh Anda) di mana Anda menggunakan metode-LINQ, atau bahwa Anda menggunakan IEnumerablesebagai parameter yaitu NULL.

Martin Mulder
sumber
7
Ini memecahkan masalah bagi saya, saya curiga ini adalah solusi untuk OP juga meskipun jawaban yang diterima berbeda.
NibblyPig
4
Jawabannya bagi saya adalah bahwa saya belum menginisialisasi Daftar yang saya coba filter .Where()- masih null.
Brian Lacy
1
Untuk menghindari kesalahan nol semacam ini, Anda harus mencoba meletakkan nilai default di properti IEnumerable atau mengujinya dengan Any ()
Fer R
1
Bagaimana jawaban ini dengan 140+ suara positif di bawah jawaban lain yang berperingkat jauh lebih rendah?
nldev
1
Jawaban ini lebih rendah, karena ini bukan jawaban yang diterima. Jawaban pertama mungkin adalah jawaban yang tepat untuk poster aslinya. Jawaban ini mungkin jawaban yang tepat bagi banyak orang lainnya.
Martin Mulder
11

Alasan saya berbeda dengan yang lain di sini, jadi saya pikir saya akan mempostingnya untuk siapa pun yang mungkin memiliki masalah ini.

Saya menelepon Hitung pada contoh DbSet dengan filter null yaitu

dbSet.Count(null);

Saya menemukan bahwa melewatkan nol di sini menyebabkan kesalahan jadi saya sekarang memanggil metode tanpa parameter jika filternya nol:

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

Ini menyelesaikan masalah bagi saya. Ini mungkin menjadi masalah untuk metode lain di DbSet juga.

Guy Lowe
sumber
9

Aku baru saja kesalahan yang tepat ini di Net Inti 2.2 Entity Framework karena saya tidak punya set;di saya DbContextseperti:

public DbSet<Account> Account { get; }

diubah menjadi:

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

Namun, itu tidak menunjukkan pengecualian sampai saya mencoba menggunakan kueri linq dengan Where()dan Select()seperti yang disebutkan orang lain di atas.

Saya mencoba menyetel DbSetsebagai hanya baca. Saya akan terus mencoba ...

Jumlah Tidak Ada
sumber
1
Saya baru saja mengalami masalah ini saat mencoba menggunakan Assembly saya dengan Linqpad. Terima kasih untuk ini, saya bisa menghabiskan lebih banyak waktu. .Net Core 3.1 / EF Core 3.1 di sini.
Minggu
3

hanya sebagai FYI, seseorang mungkin merasa berguna. Saya mengejar ekor saya untuk kesalahan ini hampir 2 hari dan selalu memikirkan sesuatu yang besar dan mencari kelas yang mungkin menjadi masalah dan akhirnya saya menemukan masalah yang sangat bodoh dan itu ada di kode mark up (HTML) saya di mypage.ascx . Masalahnya adalah saya memiliki <asp:EntityDataSource>dan ini telah mendapat properti termasuk dan saya memiliki beberapa tabel lain yang tercantum di sini dan keliru tabel ada di sana yang telah dihapus dari database baru-baru ini dan saya tidak pernah memperhatikan dan mengembalikan null dengan entitas lain. Saya baru saja menghapus tabel bodoh dari daftar penyertaan dan saya siap melakukannya. berharap ini bisa membantu seseorang.

johnny
sumber
2

Jika ada orang lain yang berakhir di sini dengan masalah saya dengan pengaturan Framework Entitas Pertama DB.

Singkat cerita, saya perlu membebani konstruktor Entitas untuk menerima string koneksi, alasannya adalah kemampuan untuk menggunakan wadah injeksi ketergantungan Asp.Net Core menarik string koneksi dari appsettings.json, daripada secara ajaib mendapatkannya dari App.config file saat memanggil konstruktor tanpa parameter.

Saya lupa menambahkan panggilan untuk menginisialisasi DbSets saya di overload baru. Jadi, konstruktor tanpa parameter yang dibuat secara otomatis terlihat seperti ini:

    public MyEntities()
        : base("name=MyEntity")
    {
        Set1 = Set<MyDbSet1>();
        Set2 = Set<MyDbSet2>();
    }

Dan kelebihan baru saya terlihat seperti ini:

    public MyEntities(string connectionString)
        : base(connectionString)
    {
    }

Solusinya adalah menambahkan penginisialisasi yang ditangani oleh kode yang dibuat secara otomatis, sebuah langkah sederhana yang terlewat:

     public MyEntities(string connectionString)
        : base(connectionString)
    {
        Set1 = Set<MyDbSet1>();
        Set2 = Set<MyDbSet2>();
    }

Ini benar-benar melemparkan saya untuk loop karena beberapa panggilan di Respository kami yang menggunakan DbContext bekerja dengan baik (yang tidak membutuhkan DBSets yang diinisialisasi), dan yang lainnya membuang kesalahan runtime yang dijelaskan dalam OP.

Franklin Tarter
sumber
1

Pastikan Anda memasukkan repositori ke konstruktor layanan. Itu menyelesaikannya untuk saya. :: menampar dahi ::

KennethDale1
sumber
1

Pengecualian ini akan dikembalikan jika Anda mencoba menghitung nilai dalam koleksi null.

Misalnya di bawah ini berfungsi ketika Kesalahan bukan nol, namun jika Kesalahan adalah nol maka Nilai tidak boleh nol. Nama parameter: pengecualian sumber terjadi.

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

Pengecualian ini dapat dihindari dengan memeriksa null sebagai gantinya.

if (graphQLResponse.Errors != null)
Daniel de Zwaan
sumber
1

Diatasi dengan solusi berikut

  1. Klik kanan pada edmx file tersebut, pilih Open with, XML editor
  2. Temukan entitas di edmx:StorageModels elemen
  3. Hapus DefiningQuery seluruhnya
  4. Ubah nama store:Schema="dbo"menjadiSchema="dbo" (jika ada)
  5. Hapus store:Nameproperti
Ahmedk
sumber
Schema = "dbo" ke Schema = "dbo" - apa?
Vincent Buscarello
0

Ini bisa menjadi konyol seperti dalam kasus saya di mana perubahan savech error karena db tidak memiliki kunci asing dan asosiasi ditambahkan ke tabel EDM. Saya menambahkan kunci asing di db dan membuat EDM untuk perbaikan.

Kesalahan yang saya lihat adalah sebagai berikut: Kasus 1 -> saat menggunakan DBContext untuk Pesan EDM = Nilai tidak boleh kosong. Nama parameter: sumber di System.Linq.Enumerable.Any [TSource] (IEnumerable 1 source, Func2 predicate)

Kasus 2 -> saat menggunakan ObjectContext untuk EDM Message = Tidak dapat memperbarui 'Kontak' EntitySet karena memiliki DefiningQuery dan tidak ada elemen dalam elemen untuk mendukung operasi saat ini.

(Hanya ingin membuangnya ke sana kalau-kalau itu membantu seseorang).

celana dalam
sumber
0

Di MVC, layar View memanggil metode yang ada di Controller atau Repository.cs dan menetapkan nilai kembali ke kontrol apa pun di CSHTML tetapi metode itu sebenarnya tidak diterapkan di .cs / controller, kemudian CSHTML akan menampilkan pengecualian parameter NULL

Muru Bakthavachalam
sumber
0

Saya mendapat kesalahan ini ketika saya memiliki Jenis yang tidak valid untuk properti entitas.

public Type ObjectType {get;set;}

Ketika saya menghapus properti, kesalahan berhenti terjadi.

Kirsten Keserakahan
sumber
0

Dalam kasus saya, masalah muncul saat mengkonfigurasi aplikasi web di IIS, Ketika perintah pembaruan pada catatan apa pun dipecat, kesalahan ini dihasilkan.

Itu adalah masalah izin di App_Data yang disetel ke hanya baca. Klik kanan folder, hapus centang pada kotak centang Read-only dan Anda selesai. Ngomong-ngomong, untuk tujuan pengujian, saya menggunakan database localdb yang ada di folder App_Data.

Sunil Jatolia
sumber
0

Kesalahan saya adalah lupa menambahkan .ThenInclude (s => s.SubChildEntities) ke induk .Include (c => c.SubChildEntities) ke tindakan Controller ketika mencoba memanggil SubChildEntities dalam tampilan Razor.

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

Perlu dicatat bahwa Visual Studio 2017 Community's IntelliSense tidak mengambil objek SubChildEntities di ekspresi lambda di .ThenInclude (). Itu berhasil mengkompilasi dan mengeksekusi sekalipun.

Jared G.
sumber
0

Saya tahu ini masih jauh dari tahun 2013 pertanyaan, tetapi gejala ini dapat muncul jika Anda tidak mengaktifkan pemuatan lambat saat memigrasi aplikasi ASP.NET 5 ke ASP.NET Core, dan kemudian mencoba meningkatkan ke Entity Framework Core 2.x (dari EF 6). Entity Framework Core telah memindahkan dukungan proxy pemuatan lambat ke paket terpisah , jadi Anda harus menginstalnya.

Ini terutama benar jika semua yang Anda muat adalah paket Entity Framework Core Sql Server (yang mengaktifkan Entity Framework dengan baik).

Setelah menginstal paket proxy, kemudian, seperti yang dikatakan oleh dokumen, panggil .UseLazyLoadingProxies()pada pembuat opsi DbContext (di bagian penyiapan Startup DI Anda, atau di mana pun Anda mengonfigurasi DbContext), dan properti navigasi yang menampilkan pengecualian di atas akan berhenti membuangnya, dan akan berfungsi seperti Entity Framework 6 dulu.

Michael Rivera
sumber
Saya mulai menyusuri jalur ini dan dalam beberapa skenario mungkin berhasil, tetapi saya menemukan stackoverflow.com/questions/41881169/…
infocyde
0

Saya memiliki masalah yang sama dengan XUnit. Masalahnya ada pada koneksi database saya. Periksa apakah string koneksi Anda benar atau tidak.

Chamila Maddumage
sumber
0

Dan, dalam kasus saya, saya salah mendefinisikan dua kolom berbeda saya sebagai identitas pada konfigurasi DbContext seperti di bawah ini,

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

Ketika saya memperbaikinya seperti di bawah ini,

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

Saya juga telah menyingkirkan kesalahan ini.

Kekalapan
sumber
-3

Ambil Row dalam database dan buat semua kolom null di baris itu seperti ini "NULL". Sekarang teruskan nilai NULL itu menggunakan try catch atau if else.

Jarin Farhad
sumber
ini adalah ide yang buruk
Jason Loki Smith