2008-08-18 4 views
9

저는 LINQ와 함께 저장소 패턴을 사용하고 있습니다. IRepository.DeleteOnSubmit (T Entity)이 있습니다. 그것은 잘 작동하지만 내 엔티티 클래스가 같은 인터페이스가있는 경우 :매핑에서 인터페이스 및 예외를 구현하는 LINQ

IEntity ie=repository.GetByID(1); 
repoitory.DeleteOnSubmit(ie); 


'IEntity.ID이'이있는 구성원을 던졌습니다 :

public interface IEntity { int ID {get;set;} } 

public partial class MyEntity: IEntity { 

    public int ID { 
     get { return this.IDfield; } 
     set { this.IDfield=value; } 
    } 
} 

을하고이 같은 일부 개체를 삭제하려고 SQL에 대한 지원되는 변환이 없습니다.

DB에서 데이터를 가져 오지만 삭제 및 삽입은 작동하지 않습니다. DataContext에 대한 인터페이스를 사용하는 방법? 여기


그것이 :
예외 메시지 : 멤버 'MMRI.DAL.ITag.idContent는'SQL에 지원되는 변환이 없습니다.

코드 :

var d = repContent.GetAll().Where(x => x.idContent.Equals(idContent)); 
foreach (var tagConnect in d) <- error line 
{ 
    repContet.DeleteOnSubmit(tagConnect); 

(이 DB에서 모든 태그를 가져오고이를 삭제)

그리고 스택 추적 :

[NotSupportedException: The member 'MMRI.DAL.ITag.idContent' has no supported translation to SQL.] 
    System.Data.Linq.SqlClient.Visitor.VisitMember(SqlMember m) +621763 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +541 
    System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 
    System.Data.Linq.SqlClient.SqlVisitor.VisitBinaryOperator(SqlBinary bo) +18 
    System.Data.Linq.SqlClient.Visitor.VisitBinaryOperator(SqlBinary bo) +18 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +196 
    System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 
    System.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(SqlSelect select) +46 
    System.Data.Linq.SqlClient.Visitor.VisitSelect(SqlSelect select) +20 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +1024 
    System.Data.Linq.SqlClient.SqlProvider.BuildQuery(... 

나는 부분 클래스를 장식 할 때 :

[Column(Storage = "_idEvent", DbType = "Int NOT NULL", IsPrimaryKey = true)] 
public int idContent 
{ get { return this.idEvent; } set { this.idEvent=value; } } 

it 오류 "잘못된 열 이름 'idContent'."

+2

스택 오버플로는 포럼이 아닙니다. 당신 (그리고 다른 사람들)이 질문에 "대답"으로 게시 한 것들 중 일부는 실제로 "주석"이어야합니다. 원래 질문과 답변을 편집 할 수도 있습니다. – jeroenh

답변

0

이 시도 :

using System.Data.Linq.Mapping; 

public partial class MyEntity: IEntity 
{ [Column(Storage="IDfield", DbType="int not null", IsPrimaryKey=true)] 
     public int ID 
     {   
      get { return this.IDfield; }   
      set { this.IDfield=value; }  
     } 
} 
3

이것은 나를 위해 작동 - 실제 SQL에 LINQ 쿼리를 변환하는

public partial class MyEntity: IEntity 
{ [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)] 
     public int ID 
     {   
      get { return this.IDfield; }   
      set { this.IDfield=value; }  
     } 
} 
+1

불행하게도 위를하고 문제가 있습니다 - http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/5691e0ad-ad67-47ea-ae2c-9432e4e4bd46 A와 링크가있다 해당 페이지 하단의 MS Connect에 기록 된 버그. 바라건대 여러분 중 일부는 투표 할 수 있도록 투표를 할 수 있습니다. 지금 당장은 저를 괴롭 히고있는 문제입니다 ... –

0

, Linq2SQL 당신이 그것을 줄 식을 검사합니다. 문제는 "ID"속성을 실제 DB 열 이름으로 변환 할 수 있도록 L2S에 충분한 정보를 제공하지 않았기 때문입니다. L2S가 "IDField"에 "ID"를 매핑 할 수 있는지 확인하여 원하는 것을 얻을 수 있습니다.

답변에 제공된 접근 방식을 사용하여 가능해야합니다.

디자이너를 사용하는 경우 클래스 속성 "IDField"의 이름을 "ID"로 바꾸면 더 이상 부분 클래스의 "ID"속성을 명시 적으로 구현할 필요가 없으므로, 즉 MyEntity에 대한 부분 클래스 정의는 간단하게 :

public partial class MyEntity: IEntity 
{  
} 
7

LINQ - 투 - SQL MVC4에서를 사용하는 경우 Microsoft는 인터페이스에서 == 운영자에 대한 지원을 중단 나타납니다 (또는 어쩌면이 지원되지 않았다). 그러나 == 연산자 대신 i.ID.Equals(someId)을 사용할 수 있습니다.

주조 IQueryable에서 IEnumerable까지 사용하지만 은 사용하지 말아야합니다! 이유는 : IQueryableIEnumerable의 펑키 구현입니다.IEnumerable 인터페이스를 통해 IQueryable에서 사용할 linq 메서드가 무엇이든간에 쿼리가 먼저 실행되고 모든 결과가 DB에서 메모리로 반입되며 결과적으로 데이터에 localy 메서드가 실행됩니다. 일반적으로이 메서드는 번역됩니다. SQL로 변환하고 DB에서 실행). 10 억 개의 행을 포함하는 테이블에서 하나의 행을 가져와 모든 행을 하나만 가져 오려고하면 (IQueryable에서 IEnumerable으로 부주의 한 캐스팅과 지연로드 관련 데이터가 부주의하게 발생합니다.)

분명히 Linq는 로컬 데이터 (따라서 IQueryable 만 영향을 받는다)와 인터페이스를 가진 == 연산자와 엔티티 프레임 워크 (또는 나는 들었다)와 아무런 문제가 없다.

+0

'=='는 지원되지 않습니다. 어쨌든, 대답 'i.ID.Equals (someId)'에 감사드립니다. – mykhailovskyi