Абстрактный базовый класс C # для общих столбцов в LINQ

Это то, что у меня есть

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

Моя проблема в том, что отображение не работает:

Элемент данных 'System.Guid [или System.Int32] Id' типа 'ИКС' не является частью сопоставления для типа 'ИКС'. Член выше корень иерархии наследования?

Перед попыткой сопоставить атрибуты я получил вместо этого следующее:

Не удалось найти ключевой член 'Id' ключа «Идентификатор» типа «X». Ключ может быть неправильным или поле или свойство на 'X' имеет изменил имена.

Я попытался изменить K на Guid, и это сработало, но почему? Я не понимаю, насколько типичная типизация здесь является проблемой.

Я не совсем уверен, что мне действительно нужен интерфейс, я действительно не помню, зачем я его добавил.

Итак, вопрос будет в том, : Как я могу заставить такой класс работать? Я хочу, чтобы я мог получить доступ к обычно именованному PK (Id), который всегда имеет тип K [который является Guid или Int32], и рефакторинг основных функций, таких как выбор и удаление по идентификатору

Спасибо!

EDIT:

это работает

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

То, что я хочу, было бы в основном таким же, заменив Guid на K и сделав класс BaseEntity (так что я могу использовать тот же класс для Int32 и Guid PK

8
задан bevacqua 7 October 2010 в 02:34
поделиться