값은 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 일 수 없습니다. 매개 변수 이름 : 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
예외 메시지가 설명되지 않습니까? null이 될 수없는 null이 있습니다. DB 스키마는 무엇입니까?
Ash Burlaczenko 2013

이 질문과 그에 대한 답변을 살펴볼 수 있습니다. stackoverflow.com/questions/3244336/…
Ville Salonen 2013

1
아마도 collectin의 항목 중 하나가 null 값을 갖습니다. est.price = collection [ "price"]; est.size = 컬렉션 [ "크기"];
MikeTWebb 2014

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 내부 어딘가에있는 값 IEnumerable과 함께 쿼리 Any()(또는 Where()또는 Select()또는 다른 LINQ 메소드)하지만,이 값이다 null.

LINQ 메서드를 사용하는 쿼리를 함께 넣었는지 (예제 코드 외부 어딘가에) 또는 IEnumerableNULL 인 매개 변수로 를 사용 했는지 확인합니다.


7
이것은 나에게 문제를 해결했으며 수락 된 답변이 다르더라도 이것이 OP에 대한 해결책이라고 생각합니다.
NibblyPig

4
저에게 대답은 제가 필터링하려고했던 목록을 아직 초기화하지 않았다는 .Where()null입니다. 여전히 그렇습니다 .
Brian Lacy 2014

1
이러한 종류의 null 오류를 방지하려면 IEnumerable 속성에 기본값을 입력하거나 Any ()
Fer R

1
평가가 훨씬 낮은 다른 답변보다 140 개 이상의 찬성 투표가있는이 답변은 어떻습니까?
nldev

1
이 대답은 허용되는 대답이 아니기 때문에 더 낮습니다. 첫 번째 대답은 아마도 원래 포스터의 정답 일 것입니다. 이 대답은 아마도 다른 많은 사람들에게 올바른 대답이었을 것입니다.
Martin Mulder

11

내 이유는 여기에있는 나머지와 다르기 때문에이 문제가있을 수있는 다른 사람을 위해 게시 할 것이라고 생각했습니다.

null ie 필터를 사용하여 DbSet 인스턴스에서 Count를 호출했습니다.

dbSet.Count(null);

여기에 null을 전달하면 오류가 발생하므로 필터가 null 인 경우 매개 변수없는 메서드를 호출합니다.

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

이것은 나를 위해 문제를 분류했습니다. 이것은 DbSet의 다른 메서드에서도 문제가 될 수 있습니다.


9

나는이 없어서 그냥 닷넷 코어 2.2 엔티티 프레임 워크이 정확한 오류가 발생했습니다 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

참고로 누군가가 유용하다고 생각할 수 있습니다. 나는 거의 이틀 동안이 오류에 대한 꼬리를 쫓고 있었고 항상 큰 것을 생각하고 문제가 될 수있는 클래스를 찾고 마침내 매우 어리석은 문제를 발견했으며 mypage.ascx의 마크 업 (HTML) 코드에있었습니다. . 문제는 내가 가지고 있고 <asp:EntityDataSource>여기에 포함 속성이 있고 여기에 다른 테이블이 나열되어 있으며 실수로 최근 데이터베이스에서 삭제 된 테이블이 있었고 다른 엔터티와 함께 ​​null을 반환하지 않았습니다. 방금 포함 목록에서 어리석은 테이블을 제거하고 갈 수 있습니다. 이것이 누군가를 도울 수 있기를 바랍니다.


2

다른 사람이 DB First Entity Framework 설정과 관련된 내 문제로 여기서 끝나는 경우를 대비하십시오.

간단히 말해서, 연결 문자열을 받아들이 기 위해 Entities 생성자를 오버로드해야했는데, 그 이유는 App.config에서 마술처럼 연결 문자열을 가져 오는 대신 appsettings.json에서 연결 문자열을 가져 오는 Asp.Net Core 종속성 주입 컨테이너를 사용할 수 있기 때문입니다. 매개 변수없는 생성자를 호출 할 때 파일.

새 오버로드에서 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를 사용하는 리포지토리의 일부 호출 (초기화 된 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을 다시 생성했습니다.

내가 본 오류는 다음과 같습니다. Case 1-> EDM에 DBContext를 사용할 때 Message = Value는 null 일 수 없습니다. 매개 변수 이름 : Source at System.Linq.Enumerable.Any [TSource] (IEnumerable 1 source, Func2 predicate)

사례 2-> EDM에 ObjectContext를 사용할 때 Message = DefiningQuery가 있고 현재 작업을 지원하는 요소가 요소에 없기 때문에 EntitySet 'Contact'를 업데이트 할 수 없습니다.

(누군가를 도울 경우를 대비하여 거기에 던지고 싶었습니다).


0

MVC에서 View 화면은 Controller 또는 Repository.cs에있는 메서드를 호출하고 CSHTML의 모든 컨트롤에 반환 값을 할당하지만 해당 메서드는 실제로 .cs / controller에서 구현되지 않은 경우 CSHTML에서 NULL 매개 변수 예외를 throw합니다.


0

엔터티 속성에 대해 잘못된 유형이있을 때이 오류가 발생했습니다.

public Type ObjectType {get;set;}

속성을 제거하면 오류가 발생하지 않습니다.


0

제 경우에는 IIS에서 웹 응용 프로그램을 구성하는 동안 문제가 발생했습니다. 레코드에 대한 업데이트 명령이 실행되면이 오류가 발생했습니다.

읽기 전용으로 설정된 App_Data의 권한 문제였습니다. 폴더를 마우스 오른쪽 버튼으로 클릭하고 읽기 전용 확인란을 선택 취소하면 완료됩니다. 그런데 테스트 목적으로 App_Data 폴더에있는 localdb 데이터베이스를 사용하고있었습니다.


0

내 실수는 Razor 뷰에서 SubChildEntities를 호출하려고 할 때 부모 .Include (c => c.SubChildEntities)에 .ThenInclude (s => s.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처럼 작동합니다.


이 경로를 시작했고 일부 시나리오에서는 작동 할 수 있지만 꽤
빨리이 문제를 해결했습니다.

0

XUnit에서 동일한 문제가 발생했습니다. 문제는 내 데이터베이스 연결에있었습니다. 연결 문자열이 올바른지 확인하십시오.


0

그리고 제 경우에는 아래와 같이 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 또는 if else를 사용하여 해당 NULL 값을 전달합니다.


이 끔찍한 생각입니다
제이슨 로키 스미스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.