ค่าไม่สามารถเป็นค่าว่างได้ ชื่อพารามิเตอร์: แหล่งที่มา


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

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด

ค่าไม่สามารถเป็นค่าว่างได้ ชื่อพารามิเตอร์: แหล่งที่มา

stacktrace ของ

[ArgumentNullException: ค่าไม่สามารถเป็นค่าว่างได้ ชื่อพารามิเตอร์: source] 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

คุณอาจต้องการตรวจสอบคำถามนี้และคำตอบ: stackoverflow.com/questions/3244336/…
Ville Salonen

1
อาจเป็นหนึ่งในรายการใน collectin ที่มีค่า null: est.price = collection ["price"]; est.size = คอลเลกชัน ["size"];
MikeTWebb

1
@AshBurlaczenko โอ้คุณคิดว่า? สคีมาของฉันดูเหมือนว่าทุกคอลัมน์สามารถเป็นโมฆะได้
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 เป็นค่าที่IEnumerableและสอบถามกับAny()(หรือWhere()หรือSelect()หรือ LINQ-วิธีการอื่นใด) nullแต่ค่านี้

ดูว่าคุณใส่ข้อความค้นหาไว้ด้วยกัน (นอกโค้ดตัวอย่างของคุณ) โดยที่คุณใช้วิธี LINQ หรือที่คุณใช้IEnumerableเป็นพารามิเตอร์ซึ่งเป็น NULL


7
สิ่งนี้ช่วยแก้ปัญหาให้ฉันฉันสงสัยว่านี่เป็นวิธีแก้ปัญหาสำหรับ OP เช่นกันแม้ว่าคำตอบที่ยอมรับจะแตกต่างกัน
NibblyPig

4
คำตอบสำหรับฉันคือฉันยังไม่ได้เริ่มต้นรายการที่ฉันพยายามกรอง.Where()- มันยังnullอยู่
Brian Lacy

1
เพื่อหลีกเลี่ยงข้อผิดพลาดที่เป็นโมฆะประเภทนี้คุณควรลองใส่ค่าเริ่มต้นในคุณสมบัติที่สามารถคำนวณได้ของ IE หรือทดสอบด้วย Any ()
Fer R

1
คำตอบนี้เป็นอย่างไรเมื่อมีการโหวตมากกว่า 140 รายการด้านล่างคำตอบอื่น ๆ ที่มีคะแนนต่ำกว่ามาก
nldev

1
คำตอบนี้ต่ำกว่าเนื่องจากไม่ใช่คำตอบที่ยอมรับ คำตอบแรกอาจเป็นคำตอบที่ถูกต้องสำหรับผู้โพสต์ต้นฉบับ คำตอบนี้อาจเป็นคำตอบที่ถูกต้องสำหรับคนอื่น ๆ อีกมากมาย
Martin Mulder

11

เหตุผลของฉันแตกต่างจากที่เหลือที่นี่ดังนั้นฉันคิดว่าฉันจะโพสต์เพื่อคนอื่นที่อาจมีปัญหานี้

ฉันกำลังเรียก Count บนอินสแตนซ์ของ DbSet ด้วยตัวกรองของ null ie

dbSet.Count(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
ฉันเพิ่งมีปัญหานี้ในขณะที่พยายามใช้ Assembly กับ Linqpad ขอบคุณสำหรับสิ่งนี้ฉันสามารถเสียเวลาได้มากกว่านี้ .Net Core 3.1 / EF Core 3.1 ได้ที่นี่
วันอาทิตย์ที่

3

เช่นเดียวกับ FYI บางคนอาจพบว่ามีประโยชน์ ฉันไล่ตามหาข้อผิดพลาดนี้เกือบ 2 วันและมักจะคิดอะไรใหญ่ ๆ และมองหาชั้นเรียนที่อาจเป็นปัญหาและในที่สุดฉันก็พบว่ามันเป็นปัญหาที่โง่มากและมันอยู่ในโค้ดมาร์กอัป (HTML) ของฉันใน mypage.ascx . ปัญหาคือฉันมี<asp:EntityDataSource>และสิ่งนี้มีคุณสมบัติรวมและฉันมีตารางอื่น ๆ อยู่ที่นี่และมีตารางที่ผิดพลาดซึ่งถูกลบออกจากฐานข้อมูลเมื่อเร็ว ๆ นี้และฉันไม่เคยสังเกตเห็นและส่งคืนค่าว่างกับเอนทิตีอื่น ฉันเพิ่งลบตารางโง่ออกจากรายการรวมและฉันก็พร้อมที่จะไป หวังว่านี่จะช่วยใครสักคนได้


2

ในกรณีที่มีใครพบปัญหาของฉันเกี่ยวกับการตั้งค่า DB First Entity Framework

เรื่องสั้นสั้น ๆ ฉันต้องโอเวอร์โหลดเอนทิตีคอนสตรัคเตอร์เพื่อรับสตริงการเชื่อมต่อเหตุผลคือความสามารถในการใช้คอนเทนเนอร์การฉีดแบบพึ่งพา Asp.Net Core โดยดึงสตริงการเชื่อมต่อจาก appsettings.json แทนที่จะนำมาจาก App.config อย่างน่าอัศจรรย์ ไฟล์เมื่อเรียกใช้ตัวสร้างแบบไม่มีพารามิเตอร์

ฉันลืมเพิ่มการโทรเพื่อเริ่มต้น DbSets ของฉันในโอเวอร์โหลดใหม่ ดังนั้นตัวสร้างแบบไม่ใช้พารามิเตอร์ที่สร้างขึ้นโดยอัตโนมัติจึงมีลักษณะดังนี้:

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

สิ่งนี้ทำให้ฉันต้องวนซ้ำจริงๆเพราะการเรียกบางอย่างใน Respository ของเราที่ใช้ DbContext ทำงานได้ดี (การโทรที่ไม่ต้องการ DBSets ที่เริ่มต้นเหล่านั้น) และอื่น ๆ โยนข้อผิดพลาดรันไทม์ที่อธิบายไว้ใน OP


1

ตรวจสอบให้แน่ใจว่าคุณกำลังฉีดที่เก็บลงในตัวสร้างของบริการ ที่แก้ไขให้ฉัน :: ตบหน้าผาก ::


1

ข้อยกเว้นนี้จะถูกส่งกลับหากคุณพยายามนับค่าในคอลเลกชัน null

ตัวอย่างเช่นด้านล่างทำงานเมื่อข้อผิดพลาดไม่เป็นโมฆะอย่างไรก็ตามหากข้อผิดพลาดเป็นโมฆะค่าจะไม่สามารถเป็นโมฆะได้ ชื่อพารามิเตอร์:ข้อยกเว้นของแหล่งที่มาเกิดขึ้น

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

ข้อยกเว้นนี้สามารถหลีกเลี่ยงได้โดยการตรวจหาค่าว่างแทน

if (graphQLResponse.Errors != null)

1

แก้ไขได้ด้วยแนวทางแก้ไขต่อไปนี้

  1. คลิกขวาที่ไฟล์ edmxไฟล์เลือก Open with, XML editor
  2. ค้นหาเอนทิตีในไฟล์ edmx:StorageModelsองค์ประกอบ
  3. ลบไฟล์ DefiningQueryทั้งหมด
  4. เปลี่ยนชื่อstore:Schema="dbo"ไปSchema="dbo" (ถ้ามี)
  5. ลบstore:Nameคุณสมบัติ

Schema = "dbo" ถึง Schema = "dbo" - อะไร
Vincent Buscarello

0

อาจเป็นเรื่องโง่เหมือนในกรณีของฉันที่การบันทึกการเปลี่ยนแปลงเกิดข้อผิดพลาด bcoz ฐานข้อมูลไม่มีคีย์แปลกปลอมและการเชื่อมโยงถูกเพิ่มในตาราง EDM ฉันเพิ่มคีย์ต่างประเทศในฐานข้อมูลและสร้าง EDM ใหม่เพื่อแก้ไข

ข้อผิดพลาดที่ฉันพบมีดังนี้กรณีที่ 1 -> เมื่อใช้ DBContext สำหรับ EDM Message = Value ไม่สามารถเป็นค่าว่างได้ ชื่อพารามิเตอร์: ซอร์สที่ System.Linq.Enumerable.Any [TSource] (เพรดิเคต IEnumerable 1 source, Func2)

กรณีที่ 2 -> เมื่อใช้ ObjectContext สำหรับ EDM Message = ไม่สามารถอัปเดต EntitySet 'Contact' ได้เนื่องจากมี DefiningQuery และไม่มีองค์ประกอบอยู่ในองค์ประกอบเพื่อสนับสนุนการดำเนินการปัจจุบัน

(แค่อยากจะโยนทิ้งไว้ในนั้นเผื่อว่าจะมีคนช่วย)


0

ใน MVC หน้าจอ View เป็นวิธีการเรียกใช้ซึ่งอยู่ใน Controller หรือ Repository.cs และกำหนดค่าส่งคืนให้กับการควบคุมใด ๆ ใน CSHTML แต่วิธีการนั้นไม่ได้ใช้งานใน. cs / controller จากนั้น CSHTML จะโยนข้อยกเว้นพารามิเตอร์ NULL


0

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันมี Type ที่ไม่ถูกต้องสำหรับคุณสมบัติเอนทิตี

public Type ObjectType {get;set;}

เมื่อฉันลบคุณสมบัติข้อผิดพลาดหยุดเกิดขึ้น


0

ในกรณีของฉันปัญหาเกิดขึ้นขณะกำหนดค่าเว็บแอปพลิเคชันบน IIS เมื่อคำสั่งอัพเดตในเร็กคอร์ดใด ๆ เริ่มทำงานข้อผิดพลาดนี้ได้ถูกสร้างขึ้น

เป็นปัญหาการอนุญาตใน App_Data ซึ่งตั้งค่าเป็นแบบอ่านอย่างเดียว คลิกขวาที่โฟลเดอร์ยกเลิกการเลือกช่องทำเครื่องหมายอ่านอย่างเดียวและคุณทำเสร็จแล้ว อย่างไรก็ตามเพื่อการทดสอบฉันใช้ฐานข้อมูล localdb ซึ่งอยู่ในโฟลเดอร์ App_Data


0

ความผิดพลาดของฉันคือลืมที่จะเพิ่ม. ThenInclude (s => s.SubChildEntities) ลงในพาเรนต์ .Include (c => c.SubChildEntities) ไปยังแอ็คชัน Controller เมื่อพยายามเรียก SubChildEntities ในมุมมอง Razor

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

ควรสังเกตว่า IntelliSense ของชุมชน Visual Studio 2017 ไม่รับวัตถุ SubChildEntities ในนิพจน์แลมบ์ดาใน. ThenInclude () มันรวบรวมและดำเนินการได้สำเร็จแม้ว่า


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 (ในส่วนการตั้งค่า Startup DI หรือที่ใดก็ตามที่คุณกำหนดค่า DbContext ของคุณ) และคุณสมบัติการนำทางที่ส่งข้อยกเว้นข้างต้นจะหยุดการขว้างปา และจะทำงานเป็น Entity Framework 6 ที่เคยใช้


ฉันเริ่มต้นเส้นทางนี้และในบางสถานการณ์มันอาจใช้งานได้ แต่ฉันพบว่ามันค่อนข้างเร็วstackoverflow.com/questions/41881169/…
infocyde

0

ฉันมีปัญหาเดียวกันกับ XUnit ปัญหาเกิดจากการเชื่อมต่อฐานข้อมูลของฉัน ตรวจสอบสายอักขระการเชื่อมต่อของคุณว่าถูกต้องหรือไม่


0

และในกรณีของฉันฉันกำหนดคอลัมน์ที่แตกต่างกันสองคอลัมน์ของฉันโดยผิดพลาดเป็นข้อมูลประจำตัวในการกำหนดค่า DbContext ดังต่อไปนี้

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 หรือ if else


นี่เป็นความคิดที่แย่มาก
Jason Loki Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.