이것은 아마도 내가 오랫동안 해결하는 데 몇 시간을 보냈던 가장 큰 시간 낭비 문제 일 것입니다.
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, Func
2 조건 자) +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 메서드를 사용하는 쿼리를 함께 넣었는지 (예제 코드 외부 어딘가에) 또는 IEnumerable
NULL 인 매개 변수로 를 사용 했는지 확인합니다.
답변
내 이유는 여기에있는 나머지와 다르기 때문에이 문제가있을 수있는 다른 사람을 위해 게시 할 것이라고 생각했습니다.
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에 설명 된 런타임 오류가 발생하기 때문에 이로 인해 루프가 발생했습니다.
답변
리포지토리를 서비스 생성자에 주입하고 있는지 확인하십시오. 그것은 나를 위해 그것을 해결했습니다. :: 이마 ::