2008-08-18 46 views
9

我在LINQ中使用存储库模式,有IRepository.DeleteOnSubmit(T实体)。它工作正常,但是当我的实体类有接口,如:LINQ,在映射中实现接口和异常的实体

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); 

抛出
“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; } } 

it抛出错误“无效的列名'idContent'。”

+2

堆栈溢出不是论坛。你(和其他人)发布的一些东西“回答”这个问题实际上应该是“评论”。您还可以编辑原始问题和任何答案。 – jeroenh 2010-01-15 10:19:16

回答

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

这对我的作品 -

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 有一个链接到一个在该页面底部的MS Connect上记录的错误。希望你们中的一些人可以投票支持它,这样它就可以看到 - 这是一个令我讨厌的问题,现在我已经有一段时间了...... – 2010-01-28 05:54:42

0

要翻译你的LINQ查询到实际的SQL,LINQ2SQL检查你给它的表达。问题在于您没有提供足够的信息让L2S能够将“ID”属性转换为实际的DB列名。您可以通过确保L2S可以将“ID”映射到“IDField”来实现您想要的功能。

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

如果您使用设计器,您也可以简单地将类属性“IDField”重命名为“ID”,并且您不必在部分类中显式实现“ID”属性,即对于myEntity所部分类定义简直变成:

public partial class MyEntity: IEntity 
{  
} 
7

看来微软使用LINQ到SQL中MVC4下降时,在接口==运营商的支持(或也许它从来就没有支持)。但是,您可以使用i.ID.Equals(someId)代替==运营商。

铸造IQueryableIEnumerable作品,但不应使用原因是:IQueryableIEnumerable的时髦实施。无论您在IQueryableIEnumerable接口上使用的linq方法都将首先执行查询,将所有结果从数据库中提取到内存中,并最终在数据上本地运行方法(通常这些方法将被转换到SQL并在数据库中执行)。想象一下,试图从一个包含十亿行的表中获取单行,并将其全部提取为一行(并且由于粗心地将IQueryable转换为IEnumerable和延迟加载相关数据而变得更糟)。

显然,LINQ的具有使用==运营商,本地数据接口没问题(所以只有IQueryable受到影响),并与实体框架(或使我听说)。

+0

===不支持。无论如何,感谢回答`i.ID.Equals(someId)`对我来说工作得很好。 – mykhailovskyi 2015-07-22 10:49:00