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; }
我的程序中有很多模型可以做类似的事情,但我们有一个数据库实践来为每一列指定特定的名称,所以 "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; }