У меня есть много моделей в моей программе, которые выполняют подобные вещи, но у нас есть практика базы данных, чтобы дать каждому столбцу конкретные имена так: «PersonId «вместо« Id »Entity Framework Обобщите идентификатор и родительское имя, но у вас есть определенные имена, такие как «ReferralId» и «ClientID».
Но я хотел бы иметь дело с ними в общем виде. Так, например, в классе я включил ниже, я хочу сделать что-то вроде:
public virtual List<TModel> GetAll(int parentId)
{
return Context.Where(i => i.ParentID == parentId).ToList();
}
Но я не могу этого сделать, если ParentID, если его не отображается в столбце базы данных The specified type member is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported
Так я сейчас пытаясь отобразить его в столбец базы данных:
public interface IGenModel
{
int Id { get; set; }
int ParentID { get; set; }
}
public class ChildNote : BaseModel, IGenModel
{
[Key]
[DisplayName("Child Note ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("ChildId")]
public int Id { get; set; }
[DisplayName("Referral")]
[Column("ReferralId")]
public int ParentID { get; set; }
[DisplayName("Cinican Notes")]
public string Notes { get; set; }
[ForeignKey("ReferralId")]
public virtual Referral Referral { get; set; }
/* Finally I tried to add something like this here
[NotMapped]
[Required]
[DisplayName("Referral")]
public int ReferralId => ParentID
*/
/* Original set uup
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DisplayName("Child Note ID")]
public int ChildId { get; set; }
[Required]
[DisplayName("Referral")]
public int ReferralId { get; set; }
public int Id { get; set; }
{
get { return ChildId; }
set { ChildId = value; }
}
public int ParentID { get; set; }
{
get { return ReferralId; }
set { ReferralId = value; }
}*/
}
Но когда я пытаюсь создать или обновить базу данных, я получаю ошибки из-за:
[ForeignKey("ReferralId")]
public virtual Referral Referral { get; set; }
Как говорится, ReferralId не сопоставляется с чем-то в модели.
Я борюсь с проигравшей битвой здесь? Разве это невозможно обобщить? И просто примите, что все мои обращения контекста, возможно, должны быть специализированными? Я не смогу изменить правило, которое мы всегда префикс «Id» с именем модели, по-видимому, очень полезно для поиска в базе данных, которая имеет для меня смысл.
и классы, которые я хочу использовать
public abstract class GenLoader<TSelf, TModel> where TModel : BaseModel, IGenModel where TSelf : class, new()
{
private static TSelf instance = null;
public static TSelf Instance
{
get
{
if (instance == null)
{
instance = new TSelf();
}
return instance;
}
}
protected abstract DbSet<TModel> Context { get; }
public virtual TModel Get(int id)
{
return Context.FirstOrDefault(i => i.Id == id);
}
public virtual List<TModel> GetAll(int parentId)
{
return Context.Where(i => i.ParentID == parentId).ToList();
}
public virtual void OnAdd(TModel model)
{
}
public virtual void Add(TModel model)
{
model.LastModifiedBy = WebSecurity.CurrentUserId;
model.LastModified = DateTime.Now;
OnAdd(model);
using (TransactionScope scope = new TransactionScope())
{
Context.Add(model);
ModelContext.Current.SaveChanges();
scope.Complete();
}
}
public virtual void OnUpdate(TModel model)
{
}
public void Update(TModel model)
{
model.LastModifiedBy = WebSecurity.CurrentUserId;
model.LastModified = DateTime.Now;
OnUpdate(model);
using (TransactionScope scope = new TransactionScope())
{
ModelContext.Current.Entry(model).State = EntityState.Modified;
ModelContext.Current.SaveChanges();
scope.Complete();
}
}
}
public class ChildNotes : GenLoader<ChildNotes, ChildNote>
{
protected override DbSet<ClinicalNote> Context => ModelContext.Current.ClinicalNotes;
}
Первый пример отлично работал, спасибо, я не совсем понимаю причину использования одного над другим? – chrispepper1989
Никаких особых аргументов. Оба подхода должны быть взаимозаменяемыми, я предложил второй, потому что все атрибуты, описывающие столбец таблицы db, применяются в одном месте - свойство ParentId. –