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 转换。

从数据库中获取数据有效,但删除和插入无效。如何对 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);

(它从数据库中获取所有标签,并删除它们)

和堆栈跟踪:

[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

7

在 MVC4 中使用 linq-to-sql 时,微软似乎放弃了对==接口中运算符的支持(或者可能从未支持过)。但是,您可以使用i.ID.Equals(someId)代替==运算符。

铸造IQueryableIEnumerable作品,但不应该使用!原因是:IQueryable有时髦的IEnumerable. 无论您将IQueryable通过IEnumerable接口在 a 上使用什么 linq 方法,都会首先执行查询,将所有结果从数据库中提取到内存中,并最终在数据上本地运行该方法(通常这些方法将被转换为 SQL并在数据库中执行)。想象一下,试图从包含十亿行的表中获取单行,获取所有行只是为了选择一个(如果粗心地转换IQueryabletoIEnumerable和延迟加载相关数据,情况会变得更糟)。

显然,Linq 使用==带有本地数据接口的运算符(因此仅IQueryable受到影响)以及实体框架(或者我听说过)都没有问题。

于 2014-12-15T14:05:55.260 回答
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

尝试这个:

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 回答
0

为了将您的 LINQ 查询转换为实际的 SQL,Linq2SQL 会检查您给它的表达式。问题是您没有为 L2S 提供足够的信息,无法将“ID”属性转换为实际的数据库列名。您可以通过确保 L2S 可以将“ID”映射到“IDField”来实现您想要的。

使用答案中提供的方法应该可以做到这一点。

如果您使用设计器,您还可以简单地将类属性“IDField”重命名为“ID”,额外的好处是您不必再在分部类中显式实现“ID”属性,即分部类MyEntity 的定义简单地变成:

public partial class MyEntity: IEntity 
{    
}
于 2010-01-15T10:16:29.857 回答