实体框架忽略 NotMapped 属性

问题描述 投票:0回答:3

尝试保存更改时收到以下异常: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


}

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

c# entity-framework
3个回答
6
投票

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

对于 Fluent API,您还可以利用 OnModelCreating 事件来忽略属性,如下所示:

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

这里有一些有用的信息。


2
投票

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


0
投票

我有未映射实体的单独配置文件。我删除了它,然后修复了。

© www.soinside.com 2019 - 2024. All rights reserved.