2017-02-22 2 views
0

私のプログラムには類似したことをするモデルがたくさんありますが、 "Idの代わりに"Entity Framework IDと親の名前を一般化しますが、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; } 
    }*/ 


} 

しかし、私は試してみて、データベースを構築または更新するとき、私はに起因するエラーを取得:データベース列にマップしようとしている

を0

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 プロパティ名、ないマッピングされたDBのカラム名を期待しています。だから、次は、問題を修正する必要があります

[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テーブルの列を記述するすべての属性が1つの場所、つまりParentIdプロパティに適用されるため、2番目の方法を提案しました。 –

関連する問題