Değer sıfır olamaz. Parametre adı: kaynak


129

Bu muhtemelen uzun zamandır çözmeye saatler harcadığım en büyük zaman kaybı problemi.

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

Bu bana bir hata veriyor

Değer sıfır olamaz. Parametre adı: kaynak

yığın izi

[ArgumentNullException: Değer boş olamaz. Parametre adı: source] System.Linq.Enumerable.Any (IEnumerable 1 source, Func2 yüklem) +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 ... ...

Sadece tabloya bir varlık eklemek istiyorum. ORM, EF'dir.


7
İstisna mesajı açıklayıcı değil mi? Boş olamayacak bir şey boş. DB şemanız nedir?
Ash Burlaczenko

Bu soruya ve cevaplarına bakmak isteyebilirsiniz: stackoverflow.com/questions/3244336/…
Ville Salonen

1
Muhtemelen Collectin'deki girişlerden birinin boş bir değeri var: est.price = collection ["fiyat"]; est.size = koleksiyon ["beden"];
MikeTWebb

1
@AshBurlaczenko oh, sence? Şemam her sütun boş olabilir gibi görünüyor.
danielovich

2
Bağlantı dizenizi gönderebilir misiniz?
anaximander

Yanıtlar:


42

Bunu bir süre önce almıştım ve cevap, beklediğiniz gibi olmayabilir. Bu hata mesajı genellikle bağlantı dizeniz yanlış olduğunda kesilir.

Bir tahmin olarak, şunun gibi bir şeye ihtiyacınız olacak:

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

Olan şu ki, yanlış yerde bir veri kaynağı arıyor; Entity Framework bunu biraz farklı bir şekilde belirtir. Bağlantı dizenizi ve EF yapılandırmanızı gönderirseniz, kontrol edebiliriz.


2
Benim durumumda, kodda yanlış bir bağlantı dizesi, ancak yine de bir bağlantı dizesi sorunuydu.
jleach

190

DbContext'in içinde bir yerde (veya veya başka bir LINQ yöntemi) IEnumerablesorgulanan ve sorgulanan bir değerdir , ancak bu değer .Any()Where()Select()null

LINQ yöntemini kullandığınız bir sorguda (örnek kodunuzun dışında bir yerde) bir sorgu oluşturup oluşturmadığınızı veya IEnumerableNULL olan bir parametre olarak bir parametre olarak kullandığınızı öğrenin .


7
Bu benim için sorunu çözdü, kabul edilen cevap farklı olsa da bunun OP'nin çözümü olduğundan şüpheleniyorum.
NibblyPig

4
Benim için cevap, filtrelemeye çalıştığım Listeyi henüz başlatmamış olmamdı .Where()- hala öyleydi null.
Brian Lacy

1
Bu tür boş hatalardan kaçınmak için ya IEnumerable özelliklerine varsayılan bir değer koymayı denemelisiniz ya da bunları Any ()
Fer R

1
Bu yanıt, diğer çok daha düşük derecelendirilmiş yanıtların altında 140'tan fazla artı oyla nasıl?
nldev

1
Bu cevap daha düşük, çünkü kabul edilen cevap bu değil. İlk cevap muhtemelen orijinal poster için doğru cevaptı. Bu cevap muhtemelen diğer birçok insan için doğru cevaptı.
Martin Mulder

11

Sebebim buradaki diğerlerinden farklıydı, bu yüzden bu sorunu yaşayan başkaları için göndereceğimi düşündüm.

Bir DbSet örneğinde Count'u boş ie filtresiyle çağırıyordum

dbSet.Count(null);

Burada null geçmenin hataya neden olduğunu buldum, bu yüzden şimdi filtre null ise parametresiz yöntemi çağırıyorum:

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

Bu benim için sorunu çözdü. Bu, DbSet'teki diğer yöntemler için de bir sorun olabilir.


9

Net Core 2.2 Entity Framework'te bu tam hatayı aldım çünkü set;benim DbContextgibilerimde yoktu:

public DbSet<Account> Account { get; }

şu şekilde değiştirildi:

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

Ancak, Where()ve ile bir linq sorgusu kullanmaya çalışana kadar istisnayı göstermedi.Select() diğerleri yukarıda bahsettiği gibi .

Sadece DbSetokunur olarak ayarlamaya çalışıyordum . Denemeye devam edeceğim...


1
Assembly'imi Linqpad ile kullanmaya çalışırken tam olarak bu problemi yaşadım. Bunun için teşekkürler, daha çok zaman kaybedebilirdim. .Net Core 3.1 / EF Core 3.1 burada.
Pazar

3

Bilginize olduğu gibi, birisi onu faydalı bulabilir. Neredeyse 2 gündür bu hata için kuyruğumu kovalıyordum ve her zaman büyük bir şey düşünüyordum ve sorun olabilecek sınıfları arıyordum ve sonunda çok aptalca bir sorun buldum ve mypage.ascx'deki işaretleme (HTML) kodumdaydı . sorun, bir sahip olduğum <asp:EntityDataSource>ve bunun bir içerme özelliğine sahip olduğuydu ve burada listelenen başka tablolar var ve yanlışlıkla son zamanlarda veritabanından silinen bir tablo vardı ve hiç fark etmedim ve diğer varlıklarla boş dönüyordu. Aptal masayı dahil etme listesinden kaldırdım ve gitmeye hazırım. umarım bu birine yardımcı olabilir.


2

DB First Entity Framework kurulumuyla ilgili sorunumla başka birinin burada bitmesi durumunda.

Uzun lafın kısası, Entities kurucusunu bir bağlantı dizesini kabul etmek için aşırı yüklemem gerekiyordu; bunun nedeni, bağlantı dizesini App.config'den sihirli bir şekilde almak yerine appsettings.json'dan çekerek Asp.Net Core bağımlılık enjeksiyon kabını kullanma becerisidir. parametresiz kurucuyu çağırırken dosya.

DbSetlerimi yeni aşırı yüklemede başlatmak için çağrıları eklemeyi unuttum. Bu nedenle, otomatik olarak oluşturulan parametresiz kurucu şuna benzer:

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

Ve yeni aşırı yüklemem şuna benziyordu:

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

Çözüm, otomatik olarak oluşturulan kodun ilgilendiği başlatıcıları eklemekti, basit bir cevapsız adım:

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

Bu beni gerçekten bir döngüye soktu çünkü DbContext'i kullanan Respository'deki bazı çağrılar iyi çalıştı (başlatılan DBSet'lere ihtiyaç duymayanlar) ve diğerleri OP'de açıklanan çalışma zamanı hatasını attı.


1

Depoyu hizmetin kurucusuna enjekte ettiğinizden emin olun. Bu benim için çözdü. :: alnına şapırdatır ::


1

Boş bir koleksiyondaki değerleri saymaya çalışırsanız bu istisna döndürülecektir.

Örneğin, aşağıdaki Hatalar boş olmadığında çalışır, ancak Hatalar boş ise Değer boş olamaz. Parametre adı: kaynak istisnası oluşur.

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

Bu istisna, bunun yerine null kontrol edilerek önlenebilir.

if (graphQLResponse.Errors != null)

1

Aşağıdaki çözümle çözüldü

  1. edmxDosyaya sağ tıklayın , Birlikte aç'ı seçin, XML düzenleyici
  2. İçinde varlık bulun edmx:StorageModelselemanı
  3. DefiningQueryTamamen kaldır
  4. Yeniden adlandır store:Schema="dbo"için Schema="dbo"(varsa)
  5. store:NameMülkü kaldırın

Şema = "dbo" ile Şema = "dbo" - ne?
Vincent Buscarello

0

Benim durumumda, kayıt değişikliklerinin bcoz'da hata yapması gibi aptalca olabilirdi, db'nin yabancı anahtarları yoktu ve EDM tablolarına ilişkilendirmeler eklendi. DB'ye yabancı anahtarlar ekledim ve düzeltme için EDM'yi yeniden oluşturdum.

Gördüğüm hatalar aşağıdaki gibidir: Durum 1 -> EDM için DBContext kullanılırken Mesaj = Değer boş olamaz. Parametre adı: System.Linq.Enumerable.Any [TSource] (IEnumerable1 source, Func 2 yüklemi)

Durum 2 -> EDM için ObjectContext kullanılırken Message = EntitySet 'Contact' güncellenemiyor çünkü bir DefiningQuery'ye sahip ve öğede mevcut işlemi destekleyecek hiçbir öğe yok.

(Birine yardım etmesi ihtimaline karşı onu oraya atmak istedim).


0

MVC'de Görünüm ekranı, Controller veya Repository.cs'de bulunan yöntemi çağırıyor ve CSHTML'deki herhangi bir kontrole dönüş değeri atıyor, ancak bu yöntem aslında .cs / controller'da uygulanmıyor, ardından CSHTML NULL parametresi istisnasını atacak


0

Bir varlık özelliği için geçersiz bir Türüm olduğunda bu hatayı aldım.

public Type ObjectType {get;set;}

Mülkü kaldırdığımda hata oluşmayı durdurdu.


0

Benim durumumda, web uygulamasını IIS'de yapılandırırken sorun ortaya çıktı, Herhangi bir kayıttaki güncelleme komutu çalıştırıldığında bu hata oluşturuldu.

App_Data'da salt okunur olarak ayarlanmış bir izin sorunuydu. Klasöre sağ tıklayın, Salt okunur onay kutusunun işaretini kaldırın ve bitirdiniz. Bu arada, test amacıyla, App_Data klasöründe bulunan localdb veritabanını kullanıyordum.


0

Hatam, Razor görünümünde SubChildEntities'i çağırmaya çalışırken .ThenInclude (s => s.SubChildEntities) öğesini ana .Include (c => c.SubChildEntities) öğesini Denetleyici eylemine eklemeyi unutmaktı.

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

Visual Studio 2017 Topluluğu'nun IntelliSense'in .ThenInclude () içindeki lambda ifadesinde SubChildEntities nesnesini almadığına dikkat edilmelidir. Yine de başarıyla derler ve yürütür.


0

Bunun sorunun 2013 yılından çok uzun bir yol olduğunu biliyorum, ancak bir ASP.NET 5 uygulamasını ASP.NET Core'a geçirirken tembel yüklemeyi etkinleştirmediyseniz ve ardından yükseltme yapmaya çalışırken bu belirti ortaya çıkabilir. Entity Framework Core 2.x (EF 6'dan). Entity Framework Core, geç yükleme proxy desteğini ayrı bir pakete taşıdı , bu nedenle onu yüklemeniz gerekir.

Yüklediğiniz her şey bir Entity Framework Core Sql Server paketiyse bu özellikle doğrudur (Entity Framework'ü açar ve iyi olur).

.UseLazyLoadingProxies()Proxy paketini kurduktan sonra, belgelerin dediği gibi, DbContext seçenekleri oluşturucusunu çağırın (Başlangıç ​​DI kurulum bölümünüzde veya DbContext'inizi nerede yapılandırırsanız) ve yukarıdaki istisnayı atan gezinme özelliği onu atmayı bırakacaktır. ve Entity Framework 6'da olduğu gibi çalışacaktır.


Bu yolda başladı ve bazı senaryolarda işe yarayabilir, ama oldukça hızlı bir şekilde bu karşılaştım stackoverflow.com/questions/41881169/...
infocyde

0

XUnit ile aynı sorunu yaşadım. Sorun veritabanı bağlantımla ilgiliydi. Bağlantı dizenizin doğru olup olmadığını kontrol edin.


0

Ve benim durumumda, yanlışlıkla iki farklı sütunumu aşağıdaki gibi DbContext yapılandırmalarındaki kimlikler olarak tanımlıyorum,

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

Aşağıdaki gibi düzelttiğimde,

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

Ben de bu hatadan kurtuldum.


-3

Veritabanında bir Satır alın ve bu satırdaki tüm sütunları şu "NULL" gibi boş yapın. Şimdi bu NULL değerini try catch veya if else kullanarak iletin.


bu berbat bir fikir
Jason Loki Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.