实体框架正在忽略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

}

最奇怪的是,这段代码在本地运行得非常好,但在我们的生产环境中却不行。我检查过数据库,它看起来是一样的。

实体框架正在忽略NotMapped属性

如果没有更多信息或代码示例,就不知道是否使用Fluent API。

在Fluent API的情况下,您还可以使用OnModelCreating事件来忽略属性,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<YourModel>().Ignore(t => t.ClientID );
   base.OnModelCreating(modelBuilder);
}

这里有一些有用的信息。

实际错误来自一个存储过程。这非常令人困惑,因为实体框架没有转储整个错误消息(包括过程名称),并且看起来EF只是生成了不正确的SQL。相反,存储过程只是有一些过时的定义,导致了这个问题。