2017-02-22 2 views
0

У меня есть много моделей в моей программе, которые выполняют подобные вещи, но у нас есть практика базы данных, чтобы дать каждому столбцу конкретные имена так: «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; 


} 

ответ

1

При нанесении на свойства навигации, ForeignKey атрибут ожидает FK имя свойства, не отображается имя столбца БД. Таким образом, следующее должно решить проблему:

[ForeignKey("ParentID")] 
public virtual Referral Referral { get; set; } 

Альтернатива, так как вы положили много атрибутов FK собственности, удалить атрибут ForeignKey из свойства навигации и применить его на свойстве FK, в этом случае он ожидает навигации название свойства в качестве аргумента:

[DisplayName("Referral")] 
[Column("ReferralId")] 
[ForeignKey("Referral")] 
public int ParentID { get; set; } 

... 

public virtual Referral Referral { get; set; } 
+0

Первый пример отлично работал, спасибо, я не совсем понимаю причину использования одного над другим? – chrispepper1989

+0

Никаких особых аргументов. Оба подхода должны быть взаимозаменяемыми, я предложил второй, потому что все атрибуты, описывающие столбец таблицы db, применяются в одном месте - свойство ParentId. –

Смежные вопросы