그래서 DB에 대한 연결로 DataContext를 사용하고 있습니다. 나는 삭제 된 것들을 제외하고 DB에서 모든 회사를 얻고 싶습니다. 내가 이것을 사용 (모든 삭제 제외) 회사를 얻을 할 때C# Linq to SQL 잘못된 캐스트 예외
class DataManager : DataContext {
public Table<Company> Companies {
get {
return this.GetTable<Company>();
}
}
//other tables emited
}
그리고 : 내 회사 객체 :
는[Table(Name = "Companies")]
class Company {
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int Id { get; set; }
[Column]
public bool Deleted { get; set; }
[Column]
public DateTime DateCreated { get; set; }
[Column]
public DateTime? DateModified { get; set; }
[Column]
public string Name { get; set; }
private EntitySet<Platform> _Platforms;
[Association(Storage = "_Platforms", OtherKey = "CompanyId")]
public virtual EntitySet<Platform> Platforms {
get {
return this._Platforms;
}
set {
this._Platforms.Assign(value);
}
}
public Company() {
this._Platforms = new EntitySet<Platform>();
}
}
내의 DataContext 개체는
List<Company> comp = _db.Companies.Where(x => !x.Deleted).ToList();
_db입니다 이 시점에서 별도로 생성되며 NULL이 아닙니다.
그리고 "! x.Deleted"부분에 예외가 발생합니다. "InvalidCastException : 지정한 캐스트가 유효하지 않습니다."
스택 추적 : (객체와 동일)를 DB에서
at System.Data.SqlClient.SqlBuffer.get_Boolean()
at System.Data.SqlClient.SqlDataReader.GetBoolean(Int32 i)
at Read_Company(ObjectMaterializer`1)
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at GameShop.Form1.UpdateCompanyList() in c:\Users\Xpym\Documents\Visual Studio 2012\Projects\GameShop\GameShop\Form1.cs:line 117
at GameShop.Form1..ctor() in c:\Users\Xpym\Documents\Visual Studio 2012\Projects\GameShop\GameShop\Form1.cs:line 20
at GameShop.Program.Main() in c:\Users\Xpym\Documents\Visual Studio 2012\Projects\GameShop\GameShop\Program.cs:line 16
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
는 삭제 된 필드는 널 입력이 가능하지 않습니다.
나는 또한 자동화 된 코드/테이블 생성기 (예 : EF)를 사용하지 않는다고 말할 수 있습니다.
해결 방법을 직접 찾을 수 없으므로이 문제를 도와주세요. 문제없이 다른 방법에서
갱신 내가 코드를 다음 사용하고 실행 : SQL에서
_db.Companies.Any(x=>!x.Deleted && x.Name == textBoxCompanyName.Text)
갱신 테이블은 다음과 같이 작성 :
또한CREATE TABLE [dbo].[Companies](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Deleted] [tinyint] NOT NULL,
[DateCreated] [datetime] NOT NULL,
[DateModified] [datetime] NULL,
[Name] [varchar](50) NOT NULL)
, 디버깅 할 때 LINQ가 생성하는 SQL 쿼리가 이상하다는 것을 알았습니다.
SLECT [t0].[Id] as [Id], ... FROM [Companies] as [t0]
어쩌면이 해결책을 찾는 데 도움이됩니다
SELECT [t0].[Id], ... FROM [Companies] as [t0]
보통 나는 다음을 참조하십시오.
"삭제 된"필드가 DB에 정의 된 방법은 무엇입니까? 어떤 경우라도 null이 가능합니까? 'bool' 대신'string'으로 값을 얻으려고 시도했는데 오류가 발생할 수 있다고 한번 검사 해 보셨습니까? –
시도하십시오 List comp = _db.Companies.Where (x => (x.Deleted! = null &&! x.Deleted)). ToList(); ' –
Damith
테이블 정의를 포함 할 수 있습니까? 또한 dbml 파일을 포함 시키면 도움이 될 수 있습니다. 속성에 매핑 된 열 사이에 불일치가있는 것 같습니다. 가장 가능성이 int 또는 무언가 바보에 매핑됩니다.스택 추적을 보면 SQL이 생성되고 실행되었음을 쉽게 볼 수 있으며 실패한 엔티티 클래스에 매핑됩니다. – Aron