Giá trị không thể vô giá trị. Tên tham số: nguồn


129

Đây có lẽ là vấn đề lãng phí thời gian lớn nhất mà tôi đã dành hàng giờ để giải quyết trong một thời gian dài.

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

Điều này cho tôi một lỗi về

Giá trị không thể vô giá trị. Tên tham số: nguồn

ngăn xếp của

[ArgumentNullException: Giá trị không thể rỗng. Tên tham số: nguồn] System.Linq.Enumerable.Any ( 1 source, Funcvị từ 2 IEnumerable ) +4083335 System.Data.Entity.Iternal.I INTERNalContext.WrapUpdateException (UpdateException updateException) +87
System.Data.Entity.I 193
System.Data.Entity.I Internalal.LazyI InternalalContext.SaveChanges () +33
System.Data.Entity.DbContext.SaveChanges () +20 ... ...

Tôi chỉ muốn thêm một thực thể vào bảng. ORM là EF.


7
Không phải là thông điệp ngoại lệ giải thích? Một cái gì đó là null mà không thể là null. Lược đồ db của bạn là gì?
Ash Burlaczenko

Bạn có thể muốn xem xét câu hỏi này và câu trả lời của nó: stackoverflow.com/questions
3244336 / Khăn

1
Có lẽ một trong những mục trong collin có giá trị null: est.price = sưu tập ["price"]; est.size = bộ sưu tập ["kích thước"];
MikeTWebb

1
@AshBurlaczenko oh, bạn nghĩ sao? Lược đồ của tôi trông giống như mọi cột có thể là null.
danielovich

2
Bạn có thể gửi chuỗi kết nối của bạn?
anaximander

Câu trả lời:


42

Tôi đã có cái này một lúc trước và câu trả lời không nhất thiết là những gì bạn mong đợi. Thông báo lỗi này thường mọc lên khi chuỗi kết nối của bạn sai.

Theo phỏng đoán, bạn sẽ cần một cái gì đó như thế này:

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

Điều đang xảy ra là nó đang tìm kiếm một nguồn dữ liệu không đúng chỗ; Entity Framework chỉ định nó hơi khác nhau. Nếu bạn đăng chuỗi kết nối và cấu hình EF thì chúng tôi có thể kiểm tra.


2
Trong trường hợp của tôi, đó là một chuỗi kết nối không chính xác trong mã, nhưng dù sao vẫn là một vấn đề về chuỗi kết nối.
jleach

190

Ở đâu đó bên trong DbContext là một giá trị được IEnumerablevà được truy vấn bằng Any()( Where()hoặc Select()hoặc bất kỳ phương thức LINQ nào khác), nhưng giá trị này là null.

Tìm hiểu xem bạn có đặt một truy vấn cùng nhau (ở đâu đó bên ngoài mã ví dụ của bạn) trong đó bạn đang sử dụng phương thức LINQ hoặc bạn đã sử dụng IEnumerablemột tham số làm NULL.


7
Điều này đã giải quyết vấn đề cho tôi, tôi nghi ngờ đây cũng là giải pháp cho OP mặc dù câu trả lời được chấp nhận là khác nhau.
NibblyPig

4
Câu trả lời cho tôi là tôi chưa khởi tạo Danh sách mà tôi đang cố lọc .Where()- nó vẫn còn null.
Brian Lacy

1
Để tránh loại lỗi null này, bạn nên thử đặt một giá trị mặc định trong các thuộc tính IEnumerable hoặc kiểm tra chúng bằng Any ()
Fer R

1
Làm thế nào là câu trả lời này với hơn 140 câu trả lời bên dưới các câu trả lời được đánh giá thấp hơn nhiều?
nldev

1
Câu trả lời này thấp hơn, vì nó không phải là câu trả lời được chấp nhận. Câu trả lời đầu tiên có thể là câu trả lời đúng cho poster gốc. Câu trả lời này có thể là câu trả lời đúng cho nhiều người khác.
Martin Mulder

11

Lý do của tôi khác với phần còn lại ở đây vì vậy tôi nghĩ tôi sẽ đăng nó cho bất kỳ ai khác có thể có vấn đề này.

Tôi đã gọi Count trên một thể hiện của Dbset với bộ lọc null tức là

dbSet.Count(null);

Tôi thấy rằng việc truyền null ở đây đã gây ra lỗi nên bây giờ tôi gọi phương thức không tham số nếu bộ lọc là null:

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

Điều này sắp xếp vấn đề cho tôi. Đây cũng có thể là một vấn đề đối với bất kỳ phương pháp nào khác trên DbSet.


9

Tôi chỉ có lỗi này chính xác trong Net Lõi 2.2 Entity Framework vì tôi không có set;trong tôi DbContextnhư vậy:

public DbSet<Account> Account { get; }

thay đổi để:

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

Tuy nhiên, nó đã không hiển thị ngoại lệ cho đến khi tôi cố gắng sử dụng truy vấn linq với Where()Select()như những người khác đã đề cập ở trên.

Tôi đã cố gắng để thiết lập DbSet như chỉ đọc. Tôi sẽ tiếp tục cố gắng...


1
Tôi vừa gặp vấn đề chính xác này trong khi cố gắng sử dụng hội của mình với Linqpad. Cảm ơn vì điều này, tôi có thể đã lãng phí nhiều thời gian hơn. .Net Core 3.1 / EF Core 3.1 tại đây.
Chủ nhật

3

giống như một FYI, ai đó có thể thấy nó hữu ích. Tôi đã theo đuổi lỗi này gần 2 ngày và luôn suy nghĩ điều gì đó lớn lao và tìm kiếm các lớp có thể là vấn đề và cuối cùng tôi đã tìm thấy vấn đề rất ngu ngốc và đó là mã đánh dấu (HTML) của tôi trong mypage.ascx . vấn đề là tôi có một <asp:EntityDataSource>và điều này có một thuộc tính bao gồm và tôi có một số bảng khác được liệt kê ở đây và nhầm là một bảng đã bị xóa khỏi cơ sở dữ liệu gần đây và tôi không bao giờ nhận thấy và nó trả về null với các thực thể khác. Tôi chỉ loại bỏ bảng ngu ngốc khỏi danh sách bao gồm và tôi tốt để đi. hy vọng điều này có thể giúp ai đó.


2

Trong trường hợp bất kỳ ai khác kết thúc ở đây với vấn đề của tôi với thiết lập Khung thực thể đầu tiên DB.

Tóm lại, tôi cần phải quá tải công cụ xây dựng Thực thể để chấp nhận chuỗi kết nối, lý do là khả năng sử dụng bộ chứa tiêm phụ thuộc Asp.Net Core kéo chuỗi kết nối từ appsinstall.json, thay vì lấy nó một cách kỳ diệu từ App.config tập tin khi gọi hàm tạo không tham số.

Tôi đã quên thêm các cuộc gọi để khởi tạo DbSets của mình trong tình trạng quá tải mới. Vì vậy, hàm tạo không tham số được tạo tự động trông giống như thế này:

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

Và sự quá tải mới của tôi trông như thế này:

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

Giải pháp là thêm các trình khởi tạo mà mã được tạo tự động đảm nhiệm, một bước bị bỏ lỡ đơn giản:

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

Điều này thực sự đã gây rắc rối cho tôi vì một số cuộc gọi trong Resposeective của chúng tôi đã sử dụng DbContext hoạt động tốt (những cuộc gọi không cần DBSets khởi tạo) và những cuộc gọi khác đã gây ra lỗi thời gian chạy được mô tả trong OP.


1

Hãy chắc chắn rằng bạn đang tiêm kho lưu trữ vào hàm tạo của dịch vụ. Điều đó đã giải quyết nó cho tôi. :: đập trán ::


1

Ngoại lệ này sẽ được trả về nếu bạn cố gắng đếm các giá trị trong bộ sưu tập null.

Ví dụ: bên dưới hoạt động khi Lỗi không phải là null, tuy nhiên nếu Lỗi là null thì Giá trị không thể là null. Tên tham số: ngoại lệ nguồn xảy ra.

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

Thay vào đó có thể tránh ngoại lệ này bằng cách kiểm tra null.

if (graphQLResponse.Errors != null)

1

Đã giải quyết bằng giải pháp sau

  1. Nhấp chuột phải vào edmxtệp, chọn Mở bằng, trình soạn thảo XML
  2. Xác định vị trí thực thể trong edmx:StorageModelsphần tử
  3. Loại bỏ DefiningQueryhoàn toàn
  4. Đổi tên store:Schema="dbo"thành Schema="dbo"(nếu tồn tại)
  5. Hủy bỏ store:Nametài sản

Lược đồ = "dbo" thành Schema = "dbo" - cái gì?
Vincent Buscarello

0

Nó có thể ngớ ngẩn như trong trường hợp của tôi khi các savechang bị lỗi bcoz, db không có khóa ngoại và các liên kết đã được thêm vào các bảng EDM. Tôi đã thêm khóa ngoại trong db và EDM được tạo lại để sửa lỗi.

Các lỗi tôi đã thấy như sau: Trường hợp 1 -> khi sử dụng DBContext cho EDM Message = Giá trị không thể là null. Tên tham số: nguồn tại System.Linq.Enumerable.Any [TSource] ( 1 source, Funcvị ngữ 2 số IE )

Trường hợp 2 -> khi sử dụng ObjectContext cho EDM Message = Không thể cập nhật Entityset 'Contact' vì nó có DefiningQuery và không có phần tử nào tồn tại trong phần tử để hỗ trợ hoạt động hiện tại.

(Chỉ muốn ném nó vào đó trong trường hợp nó giúp được ai đó).


0

Trong MVC, màn hình View là phương thức gọi trong Bộ điều khiển hoặc Kho lưu trữ.cs và gán giá trị trả về cho bất kỳ điều khiển nào trong CSHTML nhưng phương thức đó thực sự không được triển khai trong .cs / bộ điều khiển, sau đó CSHTML sẽ ném ngoại lệ tham số NULL


0

Tôi đã gặp lỗi này khi tôi có Loại không hợp lệ cho thuộc tính thực thể.

public Type ObjectType {get;set;}

Khi tôi xóa tài sản, lỗi đã dừng xảy ra.


0

Trong trường hợp của tôi, sự cố đã xuất hiện trong khi định cấu hình ứng dụng web trên IIS, Khi lệnh cập nhật trên bất kỳ bản ghi nào được kích hoạt, lỗi này đã được tạo.

Đó là vấn đề cấp phép trên App_Data, được đặt thành chỉ đọc. Nhấp chuột phải vào thư mục, bỏ chọn hộp kiểm Chỉ đọc và bạn đã hoàn tất. Nhân tiện, để thử nghiệm, tôi đã sử dụng cơ sở dữ liệu localdb trong thư mục App_Data.


0

Lỗi của tôi là đã quên thêm .ThenInclude (s => s.SubChildEntities) vào cha mẹ .Include (c => c.SubChildEntities) vào hành động của Trình điều khiển khi cố gắng gọi SubChildEntities trong chế độ xem Dao cạo.

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

Cần lưu ý rằng IntelliSense của Cộng đồng Visual Studio 2017 không chọn đối tượng SubChildEntities trong biểu thức lambda trong .ThenInclude (). Nó biên dịch thành công và thực thi mặc dù.


0

Tôi biết đây là một chặng đường dài từ năm 2013 của câu hỏi, nhưng triệu chứng này có thể xuất hiện nếu bạn không lười tải kích hoạt khi di chuyển ứng dụng ASP.NET 5 sang ASP.NET Core, sau đó thử nâng cấp lên Thực thể khung lõi 2.x (từ EF 6). Entity Framework Core đã chuyển hỗ trợ proxy lười biếng sang một gói riêng , vì vậy bạn phải cài đặt nó.

Điều này đặc biệt đúng nếu tất cả những gì bạn đã tải là gói Entity Framework Core Sql Server (bật Entity Framework tốt).

Sau khi cài đặt gói proxy, như tài liệu nói, gọi .UseLazyLoadingProxies()trình xây dựng tùy chọn DbContext (trong phần thiết lập Startup DI của bạn hoặc bất cứ nơi nào bạn định cấu hình DbContext của mình) và thuộc tính điều hướng ném ngoại lệ trên sẽ ngừng ném nó, và sẽ hoạt động như Entity Framework 6 đã từng.


Tôi đã bắt đầu con đường này và trong một số tình huống có thể nó hoạt động, nhưng tôi đã chạy vào stackoverflow
này.com / quickions / 41881169 / giả

0

Tôi đã có cùng một vấn đề với XUnit. Vấn đề là với kết nối cơ sở dữ liệu của tôi. Kiểm tra chuỗi kết nối của bạn có chính xác hay không.


0

Và, trong trường hợp của tôi, tôi đã xác định nhầm hai cột khác nhau của mình là danh tính trên các cấu hình DbContext như bên dưới,

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

Khi tôi sửa nó như dưới đây,

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

Tôi cũng đã thoát khỏi lỗi này.


-3

Lấy một hàng trong cơ sở dữ liệu và làm cho tất cả các cột rỗng trong hàng đó như "NULL" này. Bây giờ hãy chuyển giá trị NULL đó bằng cách sử dụng thử bắt hoặc nếu không.


đây là một ý tưởng tồi tệ
Jason Loki Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.