C# abstrakte Basisklasse für gemeinsame Spalten in LINQ
Dies ist, was ich bisher
using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Linq;
using System.Text;
namespace Firelight.Business
{
public interface IBaseEntity<K>
{
K Id { get; }
}
///<summary>
///Base business database connection object, primary key is int
///</summary>
///<typeparam name="T">Table name</typeparam>
public abstract class BaseEntity<T> : BaseEntity<T, Guid> where T : class, IBaseEntity<Guid>
{
}
///<summary>
///Base business database connection object
///</summary>
///<typeparam name="T">Table name</typeparam>
///<typeparam name="K">Primary key type</typeparam>
public abstract class BaseEntity<T,K> : IBaseEntity<K> where T : class, IBaseEntity<K>
{
//Avoids having to declare IBaseConnection at partial class level
[Column(Name = "Id", CanBeNull = false, IsPrimaryKey = true, IsDbGenerated = true)]
public K Id { get; set; } //{ return default(K); }
public static Table<T> Table
{
get { return LinqUtil.Context.GetTable<T>(); }
}
public static T SearchById(K id)
{
return Table.Single<T>(t => t.Id.Equals(id));
}
public static void DeleteById(K id)
{
Table.DeleteOnSubmit(SearchById(id));
LinqUtil.Context.SubmitChanges();
}
}
}
Mein problem ist, dass mapping nicht funktioniert:
Daten-member " System.Guid [oder System.Int32] Id - ' des Typs
'X'
ist nicht Teil des Mappings für Typ
'X'. Ist das Mitglied vor
die Wurzel einer Vererbungshierarchie?
Bevor Sie versuchen, anzeigen der Attribute, habe ich diese statt:
Nicht finden konnten, eine wichtiges Mitglied 'Id' - Schlüssel
'Id' Typ 'X'. Der Schlüssel ist möglicherweise falsch
oder das Feld oder die Eigenschaft 'X'
Namen geändert.
Ich habe versucht, ändern Sie K, um die Guid und es funktioniert, aber warum? Ich sehe nicht, wie allgemein-Eingabe ist eine Frage, die hier
Ich bin mir nicht ganz sicher, dass ich tatsächlich benötigt die Schnittstelle entweder, ich weiß nicht wirklich daran erinnern, warum ich ihn Hinzugefügt.
So, die Frage wäre: Wie kann ich eine Klasse wie diese Arbeit? Ich will es, also kann ich den Zugriff auf eine Häufig benannt PK (Id), die hat immer den Typ K [, die Guid oder Int32], und überarbeiten grundlegende Funktionen, wie das auswählen und löschen von Id
Dank!
EDIT:
dies funktioniert
using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
namespace Firelight.Business
{
public interface IBaseEntity<K>
{
K Id { get; set; }
}
///<summary>
///Base business database connection object
///</summary>
///<typeparam name="T">Table name</typeparam>
public abstract class BaseEntity<T> : IBaseEntity<Guid> where T : class, IBaseEntity<Guid>
{
//Avoids having to declare IBaseConnection at partial class level
public Guid Id { get; set; }
public static Table<T> Table
{
get { return LinqUtil.Context.GetTable<T>(); }
}
public static T SearchById(Guid id)
{
return Table.Single<T>(t => t.Id.Equals(id));
}
public static void DeleteById(Guid id)
{
Table.DeleteOnSubmit(SearchById(id));
LinqUtil.Context.SubmitChanges();
}
}
}
Was ich will, wäre im Grunde das gleiche, ersetzen Guid mit K und die Klasse BaseEntity (so kann ich mit der gleichen Klasse für Int32 und Guid PKs
- und Sie versuchen, dies zu tun in L2SQL? Mann, viel Glück. Wenn Sie begreifen, dass Sie nicht (leicht), begrüssen wir Sie über die wunderbare Welt von Entity Framework. 🙂
- bitte erläutern Sie 😛
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie suchen, zu tun nicht Arbeit mit LINQ to SQL. Verwenden Sie Vererbung mit LINQ to SQL verwenden Sie die [InheritanceMapping] - Attribut auf Ihre Basis-Klasse. Lassen Sie uns sagen, Sie haben eine Basis-Klasse namens Fahrzeug und eine sub-Klasse namens Motorcycle:
Damit die Vererbung funktioniert in LINQ to SQL, die Sie anwenden müssen
[InheritanceMapping]
an der Basis-Klasse und Sie haben auch eine Diskriminator-Spalte (z.B., VehicleType in dem obigen Beispiel). Beachten Sie den Code in der InheritanceMapping ist "1" - das heißt, wenn der VehicleType aus der Datenbank "1" ist, dann erstelle die Motorrad-sub-Klasse. Sie wenden eine[InheritanceMapping]
- Attribut auf die Basisklasse für jeder sub-Klasse, die Sie unterstützen.Von einem puristischen Standpunkt aus, ist dies ein Verstoß gegen OO, weil die Basis-Klasse weiß über die sub-Klassen. Das bisschen Verrücktheit in der Regel bringt Menschen, die sich ein wenig darüber, wie Sie mit LINQ to SQL implementiert die Vererbung. Aber dort haben Sie es.
Update
Das funktioniert:
Den Unterschied bemerken, ist, dass ich nicht irgendwelche
[Column]
- Attribut auf die Id-Eigenschaft. Auch bemerken, dass ich es gemacht Abstrakt. Die implementierende Klasse sieht wie folgt aus:Beachten Sie die
Id
Eigenschaft in dieser Klasse hat haben eine[Column]
- Attribut, und ich bin überschreiben der abstrakten propety. Also habe ich überprüft, das funktioniert.Having said that, es gibt ein paar Gründe, warum ich Frage, die Ihre aktuellen design. Zuerst haben Sie Ihre Daten zugreifen-Methoden als Teil Ihrer Person, und viele Menschen (mich eingeschlossen) halten dies für eine Verletzung der Trennung von Bedenken. Man könnte einführen, das Repository pattern hier und habe ein repository für jede Entität zu machen, dass-repository generische basierend auf dem Typ und Schlüssel. Die andere Sache, die seltsam ist, über den oben erwähnten Ansatz ist, dass die
BaseEntity
hat eine Id-Eigenschaft und die sub-Klasse (in meinem Beispiel dieContact
Klasse) hat auch eine Eigenschaft-Id (um LINQ To SQL glücklich). Hatte, um die Id-Eigenschaft in der Basisklasse Abstrakt und überschreiben Sie es in der Implementierung. Dies verstößt gegen TROCKENE, weil ich ' ll haben, dies zu tun für jede Entität. Aber das ist eine andere Sache, dass ist das Ergebnis der Reifen müssen Sie springen durch, um LINQ to SQL glücklich. Aber es wird Arbeit! 🙂