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 😛
InformationsquelleAutor bevacqua | 2010-10-07
Schreibe einen Kommentar