Entity Framework 概括 Id 和 Parent Name 但具有特定名称,如 "ReferralId" 和 "ClientID"

Entity Framework Generalise Id and Parent Name but have specific names like "ReferralId" and "ClientID"

我的程序中有很多模型可以做类似的事情,但我们有一个数据库实践来为每一列指定特定的名称,所以 "PersonId" 而不是 "Id"

但我想以通用的方式处理它们。因此,例如在 class 中,我在下面包含了我想做的事情:

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" 前缀的规则,显然它对数据库中的搜索非常有用,这对我来说很有意义。

和我想使用的 classes

    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;


}

应用于导航 属性 时,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; }