2014-01-13 3 views
2

그래서 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] 

보통 나는 다음을 참조하십시오.

+0

"삭제 된"필드가 DB에 정의 된 방법은 무엇입니까? 어떤 경우라도 null이 가능합니까? 'bool' 대신'string'으로 값을 얻으려고 시도했는데 오류가 발생할 수 있다고 한번 검사 해 보셨습니까? –

+0

시도하십시오 List comp = _db.Companies.Where (x => (x.Deleted! = null &&! x.Deleted)). ToList(); ' – Damith

+0

테이블 정의를 포함 할 수 있습니까? 또한 dbml 파일을 포함 시키면 도움이 될 수 있습니다. 속성에 매핑 된 열 사이에 불일치가있는 것 같습니다. 가장 가능성이 int 또는 무언가 바보에 매핑됩니다.스택 추적을 보면 SQL이 생성되고 실행되었음을 쉽게 볼 수 있으며 실패한 엔티티 클래스에 매핑됩니다. – Aron

답변

5

귀하의 Db 매핑이 잘못되었습니다. [dbo].[Companies].[Deleted]bit으로 변경하거나 Company.Deleted을 바이트로 변경해야합니다.

ADO.Net은 tinyintSystem.Byte (http://msdn.microsoft.com/en-us/library/cc716729%28v=vs.110%29.aspx)로 변환합니다.

사실상 그 바이트를 bool로 직접 변환하려고합니다. 귀하의 예외가 어디서 오는가.

+0

변경되었습니다! 고마워요! :) – XpyM