10

LINQ でリポジトリ パターンを使用しています。IRepository.DeleteOnSubmit(T Entity) があります。正常に動作しますが、エンティティ クラスに次のようなインターフェイスがある場合:

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

public partial class MyEntity: IEntity {

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

そして、次のようなエンティティを削除しようとしています:

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

throws
メンバー 'IEntity.ID' には、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; } }

「無効な列名 'idContent'」というエラーがスローされます。

4

4 に答える 4

3

これは私のために働きます-

public partial class MyEntity: IEntity 
 {    [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)]
      public int ID 
       {         
          get { return this.IDfield; }        
          set { this.IDfield=value;  }    
       } 
 }
于 2010-01-15T04:48:13.977 に答える
0

LINQ クエリを実際の SQL に変換するために、Linq2SQL は指定された式を検査します。問題は、L2S が「ID」プロパティを実際の DB 列名に変換できるように十分な情報を提供していないことです。L2S が「ID」を「IDField」にマップできることを確認することで、目的を達成できます。

これは、回答で提供されているアプローチを使用して可能になるはずです。

デザイナを使用する場合、クラス プロパティ「IDField」の名前を「ID」に変更するだけで、部分クラス、つまり部分クラスで「ID」プロパティを明示的に実装する必要がなくなるという利点があります。 MyEntity の定義は次のようになります。

public partial class MyEntity: IEntity 
{    
}
于 2010-01-15T10:16:29.857 に答える
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;  }    
       } 
 }
于 2008-08-18T09:33:29.610 に答える