2008-08-18 10 views
9

Ich verwende Repository-Muster mit LINQ, IRepository.DeleteOnSubmit (T-Entität). Es funktioniert gut, aber wenn meine Entitätsklasse Schnittstelle hat, wie folgt aus:LINQ, Entität, die Schnittstelle und Ausnahme in Zuordnung implementiert

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

public partial class MyEntity: IEntity { 

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

und dann versuchen, einige Unternehmen wie diese zu löschen:

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

wirft
Das Mitglied ‚IEntity.ID‘ hat keine unterstützte Übersetzung in SQL.

holen Daten aus DB funktioniert, aber löschen und einfügen nicht. Wie benutzt man die Schnittstelle gegen DataContext?


Hier ist sie:
Ausnahmemeldung: Das Mitglied 'MMRI.DAL.ITag.idContent' hat keine unterstützte Übersetzung zu SQL.

Code:

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

(es alle Tags von DB bekommt, und löscht sie)

Und Stack-Trace:

[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(... 

Wenn ich versuche, Teil-Klasse tun dekorieren:

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

es Fehler "Ungültiger Spaltenname 'idContent'."

+2

Stack Overflow ist kein Forum. Einige der Dinge, die Sie (und andere) als "Antwort" auf die Frage gepostet haben, sollten eigentlich "Kommentare" sein. Sie können auch die ursprüngliche Frage und jede Antwort bearbeiten. – jeroenh

Antwort

0

Try this:

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

Dies funktioniert für mich -

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

Es gibt Probleme mit leider die oben tun - http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/5691e0ad-ad67-47ea-ae2c-9432e4e4bd46 dort zu einem einen Link ist Fehler bei MS Connect am Ende dieser Seite protokolliert. Hoffentlich können einige von euch es abstimmen, damit es angeschaut werden kann - es ist ein Problem, das mich schon eine Weile nervt ... –

0

Für Ihre LINQ-Abfrage zu tatsächlichen SQL zu übersetzen, prüft Linq2SQL Sie den Ausdruck geben. Das Problem besteht darin, dass Sie nicht genügend Informationen für L2S bereitgestellt haben, um die Eigenschaft "ID" in den Namen der tatsächlichen DB-Spalte zu übersetzen. Sie können erreichen, was Sie wollen, indem Sie sicherstellen, dass L2S "ID" zu "IDField" zuordnen kann.

Dies sollte mit dem in den Antworten angegebenen Ansatz möglich sein.

Wenn Sie den Designer verwenden, können Sie auch einfach die Klasseneigenschaft "IDField" in "ID" umbenennen, mit dem zusätzlichen Vorteil, dass Sie die Eigenschaft "ID" in Ihrer Teilklasse nicht mehr explizit implementieren müssen. dh die partielle Klassendefinition für MyEntity einfach wird:

public partial class MyEntity: IEntity 
{  
} 
7

es scheint Microsoft Unterstützung in Schnittstellen für == Betreiber fiel bei der Verwendung von Linq-to-sQL in MVC4 (oder vielleicht war es nie unterstützt). Sie können jedoch i.ID.Equals(someId) anstelle des == Operators verwenden.

Casting IQueryable zu IEnumerable funktioniert aber sollte nicht verwendet werden! Der Grund ist: IQueryable hat funky Implementierung von IEnumerable.Unabhängig von der Linq-Methode, die Sie für IQueryable über die Schnittstelle IEnumerable verwenden, wird die Abfrage zuerst ausgeführt, alle Ergebnisse aus der DB in den Speicher geladen und schließlich die Methodenlocaly für die Daten ausgeführt (normalerweise werden diese Methoden übersetzt) zu SQL und in der DB ausgeführt). Stellen Sie sich vor, Sie versuchen, eine einzelne Zeile aus einer Tabelle mit Milliarden Zeilen zu erhalten und alle zu holen, nur um eine auszuwählen (und wird durch unvorsichtiges Casting von IQueryable zu IEnumerable und lazy loading bezogenen Daten viel schlimmer).

Offenbar Linq hat kein Problem mit == Operator mit Schnittstellen auf lokale Daten (so nur IQueryable ist betroffen) und auch mit Entity Frameworks (oder so habe ich gehört).

+0

Es ist wirklich seltsam, dass '==' nicht unterstützt wird. Wie auch immer, danke für die Antwort 'i.ID.Equals (someId)' funktioniert gut für mich. – mykhailovskyi