[C#] 값은 null 일 수 없습니다. 매개 변수 이름 : 소스

이것은 아마도 내가 오랫동안 해결하는 데 몇 시간을 보냈던 가장 큰 시간 낭비 문제 일 것입니다.

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입니다.



답변

나는 이것을 오래전에 가지고 있었고 대답은 반드시 당신이 기대하는 것이 아닙니다. 이 오류 메시지는 연결 문자열이 잘못되었을 때 자주 표시됩니다.

추측에 따르면 다음과 같은 것이 필요합니다.

<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 구성을 게시하면 확인할 수 있습니다.


답변

DbContext 내부 어딘가에있는 값 IEnumerable과 함께 쿼리 Any()(또는 Where()또는 Select()또는 다른 LINQ 메소드)하지만,이 값이다 null.

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


답변

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

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

dbSet.Count(null);

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

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

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


답변

나는이 없어서 그냥 닷넷 코어 2.2 엔티티 프레임 워크이 정확한 오류가 발생했습니다 set;내에서 DbContext이렇게 같은 :

public DbSet<Account> Account { get; }

로 변경:

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

내가 함께 LINQ 쿼리를 사용하려고 할 때까지 그러나, 예외를 보이지 않았다 Where()그리고 Select()위에서 언급 한 다른 사람으로.

DbSet읽기 전용 으로 설정하려고했습니다 . 계속 노력 할게 …


답변

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


답변

다른 사람이 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에 설명 된 런타임 오류가 발생하기 때문에 이로 인해 루프가 발생했습니다.


답변

리포지토리를 서비스 생성자에 주입하고 있는지 확인하십시오. 그것은 나를 위해 그것을 해결했습니다. :: 이마 ::