实体框架正在忽略NotMapped属性
本文关键字:NotMapped 属性 框架 实体 | 更新日期: 2023-09-27 18:26:07
尝试保存更改时收到以下异常:System.Data.SqlClient.SqlException:列名"ClientID"无效。列名"ID"无效。
ClientID属性具有[NotMapped]属性,而类没有ID属性。此外,数据库表匹配正确的属性。我知道,当您有一个没有关联FK的导航属性时,有时EntityFramework会创建隐式外键列,但这里的情况并非如此。
public class AccountPreference : fgleo.Objects.PortfolioManagement.IAccountPreference
{
#region Constructors
public AccountPreference() { }
#endregion
#region Fields & Properties
public Guid Guid { set; get; }
[ForeignKey("Account"), Key]
public int AccountID { set; get; }
public virtual tAccount Account
{
get;
set;
}
public string Nickname { set; get; }
public string AccountType { set; get; }
public string InsuranceCompanyName { set; get; }
public string PolicyName { set; get; }
public ContainerType ContainerType { set; get; }
public bool Hide { set; get; }
public bool IsActive { set; get; }
public bool IsReviewed { set; get; }
public bool IsPreserved { set; get; }
public bool IsImplemented { set; get; }
public bool AllocateByAccount { set; get; }
public bool IsActivelyManaged { set; get; }
public int AccountRiskTolerance { set; get; }
public decimal? BalanceAtAccountLock { set; get; }
public bool AddCashHolding { set; get; }
public bool RefreshCalcs { set; get; }
public bool UsePortfolioOverride { set; get; }
public bool UseBestOfClassOverride { set; get; }
public bool UseSavedRecommendations { set; get; }
public bool WaitingForTimer { set; get; }
public AccountPendingStatus PendingStatus { set; get; }
public DateTime? DatePendingChange { set; get; }
[NotMapped]
public int ClientID
{
get
{
return (int) ClientIDNullable;
}
set
{
this.ClientIDNullable = value;
}
}
public virtual Client Client { get; set; }
[ForeignKey("Client")]
public int? ClientIDNullable { get; set; }
#endregion
}
最奇怪的是,这段代码在本地运行得非常好,但在我们的生产环境中却不行。我检查过数据库,它看起来是一样的。
如果没有更多信息或代码示例,就不知道是否使用Fluent API。
在Fluent API的情况下,您还可以使用OnModelCreating事件来忽略属性,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<YourModel>().Ignore(t => t.ClientID );
base.OnModelCreating(modelBuilder);
}
这里有一些有用的信息。
实际错误来自一个存储过程。这非常令人困惑,因为实体框架没有转储整个错误消息(包括过程名称),并且看起来EF只是生成了不正确的SQL。相反,存储过程只是有一些过时的定义,导致了这个问题。