Это то, что у меня есть
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