LINQ,在映射中实现接口和异常的实体
时间:2020-03-05 18:40:18 来源:igfitidea点击:
我在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);
抛出
成员" 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'。"
解决方案
回答
试试这个:
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; } } }
回答
这对我有用-
public partial class MyEntity: IEntity { [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)] public int ID { get { return this.IDfield; } set { this.IDfield=value; } } }
回答
为了将LINQ查询转换为实际的SQL,Linq2SQL会检查我们提供的表达式。问题是我们没有为L2S提供足够的信息来将" ID"属性转换为实际的数据库列名称。我们可以通过确保L2S可以将" ID"映射到" IDField"来实现所需的功能。
使用答案中提供的方法应该可以做到这一点。
如果使用设计器,还可以简单地将类属性" IDField"重命名为" ID",其好处是我们不必再在子类(即子类)中显式实现" ID"属性。 MyEntity的定义就变成:
public partial class MyEntity: IEntity { }