Entity Framework генерирует sql со столбцом, который не существует в базе данных или в первой модели кода

У меня есть ситуация, когда платформа сущностей добавляет столбец contract_id в модель контракта, и этот столбец не существует как свойство в модели C#, а также не существует в базе данных. Я уже прочесал базу данных и решение для любой ссылки на 'contract_id', и я ломаю голову над этим.

[Export(typeof(IModel))]
[Grid.GridNavigator(cloneToTop = true, add = true, del = true, refresh = true, refreshstate = Grid.RefreshState.current, addfunc = "$.modules.grids.contract.add")]
[Grid.Events(serializeGridData = "$.modules.grids.common.serialize")]
public class Contract
    : Model
    , ILogicalDelete
{
    #region properties
    [Key]
    [Grid.Column("ContractID", TypeName = "int", Label = "Contract ID", Width = 75, VisibleTo = new Type[] { typeof(Contract) })]
    [Grid.Search(SearchOperators.equal)]
    [Grid.Controls.Hidden]
    public override int ID { get { return base.ID; } set { base.ID = value; } }

    [Grid.Column("CorrelationID", Hidden = true)]
    [Grid.Controls.Hidden]
    public Guid? CorrelationID { get; set; }

    //[Grid.Column("StatusID", ModelNavigation = "Status", HiddenFromNavigation = true)]
    //[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    //public int StatusID { get; set; }

    [MaxLength(100)]
    [Grid.Column("ContractDesc", TypeName = "varchar", Label = "Description")]
    [Grid.Search(SearchOperators.begins_with | SearchOperators.contains | SearchOperators.ends_with)]
    [Grid.Controls.CustomEditable(Grid.ControlType.autocomplete, Url = "/api/contractservice/list?name=contract&column=ContractDesc&_type={0}", KeyField = "ID", TextField = "ContractDesc", ForReferenceUse = true)]
    public string ContractDesc { get; set; }

    [MaxLength(100)]
    [Grid.Column("ContractType", TypeName = "varchar", Label = "Type", VisibleTo = new Type[] { typeof(Contract) }, HiddenFromNavigation = true)]
    [Grid.Search(Grid.SearchType.select, url = "/api/contractservice/list?name=ContractType", build = "$.services.grid.ctrls.select.build")]
    //[Grid.Controls.Select(Url = "/api/contractservice/list?name=ContractType", BuildSelect = "$.services.grid.ctrls.select.build")]
    public string ContractType { get; set; }

    [Grid.Column("Audited", TypeName = "bit", FormatterType = Grid.FormatterType.checkbox, Alignment = Grid.Position.center, Width = 50, HiddenFromNavigation = true)]
    [JsonConverter(typeof(Grid.Serialization.BooleanConverter))]
    public bool Audited { get; set; }

    [MaxLength(255)]
    [Grid.Column("Comment", TypeName = "varchar", HiddenFromNavigation = true)]
    public string Comment { get; set; }

    [Grid.Column("CreatedOn", TypeName = "date", Label = "Created On", FormatterType = Grid.FormatterType.date, Alignment = Grid.Position.center, Width = 75, Hidden = true, HiddenFromNavigation = true)]
    public DateTime? CreatedOn { get; set; }

    [Grid.Column("IsDeleted", TypeName = "bit", Hidden = true, Default = false, HiddenFromNavigation = true)]
    public bool is_deleted { get; set; }
    #endregion

    #region constructor
    public Contract()
    {
        Members = new HashSet<ContractMember>();
        PricingTiers = new HashSet<TierMatrix>();
        Terms = new HashSet<ContractDetail>();
    }
    #endregion

    //Status _status = null;

    //public virtual Status Status { get { return _status; } set { StatusID = value.IsNotNull(oObject => oObject.ID, StatusID); _status = value; } }

    [JsonIgnore]
    public virtual ICollection<ContractMember> Members { get; set; }

    public virtual ICollection<ContractMemberDetail> MemberDetails { get; set; }

    [JsonIgnore]
    public virtual ICollection<TierMatrix> PricingTiers { get; set; }

    [JsonIgnore]
    public virtual ICollection<ContractDetail> Terms { get; set; }
}

Конфигурация:

class ContractConfiguration
    : EntityTypeConfiguration<Models.Contract>
{
    internal ContractConfiguration(string table, string schema = "dbo")
    {
        ToTable(table, schema);

        HasKey(Model => Model.ID);

        Property(Model => Model.ID)
            .HasColumnName("ContractID")
            .HasColumnType("int")
            .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

        Property(Model => Model.ContractDesc)
            .HasColumnName("ContractDesc")
            .HasColumnType("varchar")
            .IsOptional()
            .HasMaxLength(100);

        Property(Model => Model.ContractType)
            .HasColumnName("ContractType")
            .HasColumnType("varchar")
            .IsRequired()
            .HasMaxLength(100);

        Property(Model => Model.Audited)
            .HasColumnName("Audited")
            .HasColumnType("bit")
            .IsRequired();

        Property(Model => Model.Comment)
            .HasColumnName("Comment")
            .HasColumnType("varchar")
            .IsOptional()
            .HasMaxLength(255);

        Property(Model => Model.CreatedOn)
            .HasColumnName("CreatedOn")
            .HasColumnType("smalldatetime")
            .IsRequired();

        Property(Model => Model.CorrelationID)
            .HasColumnName("CorrelationID")
            .HasColumnType("uniqueidentifier")
            .IsOptional();

        Property(Model => Model.is_deleted)
            .HasColumnName("IsDeleted")
            .HasColumnType("bit")
            .IsRequired();

        HasMany(Model => Model.Members)
           .WithRequired(Model => Model.Contract);

        HasMany(Model => Model.PricingTiers)
            .WithRequired(Model => Model.Contract);

        HasMany(Model => Model.Terms)
            .WithRequired(Model => Model.Contract);
    }
}

Модельер:

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new Configurations.ContractConfiguration("Contract", Common.Schema.contract_management));
    }

просмотр этой переменной: Context().Set(typeof(Models.Contract)).ToString()

генерирует следующее:

SELECT 
[Extent1].[ContractID] AS [ContractID], 
[Extent1].[CorrelationID] AS [CorrelationID], 
[Extent1].[ContractDesc] AS [ContractDesc], 
[Extent1].[ContractType] AS [ContractType], 
[Extent1].[Audited] AS [Audited], 
[Extent1].[Comment] AS [Comment], 
[Extent1].[CreatedOn] AS [CreatedOn], 
[Extent1].[IsDeleted] AS [IsDeleted], 
[Extent1].[Contract_ID] AS [Contract_ID] //<--- this is what does not belong
FROM [cm].[Contract] AS [Extent1]

Я рассмотрел удаление базы данных и создал сценарии для таблицы, а Contract_ID в них не отображается. Я просмотрел все внешние ключи, относящиеся к этой таблице, и убедился, что они - ContractID, а не Contract_ID. текст Contract_ID также не появляется в базе кода решений. у нас также нет никаких триггеров в этой таблице базы данных.

У меня заканчиваются места, чтобы проверить код. Я рассматриваю помощь группы, которая создаст вычисляемый столбец с именем Contract_ID, который извергает значение первичного ключа. Если кто-нибудь может дать мне представление о том, где искать, это было бы здорово.

1 ответ

Решение

Хорошо, я наконец перестроил модель C# с нуля, и я нашел причину дополнительного столбца, и проблема была в отображениях внешнего ключа

    [JsonIgnore]
    public virtual ICollection<ContractMember> Members { get; set; }
    [JsonIgnore]
    public virtual ICollection<ContractMemberDetail> MemberDetails { get; set; }
    [JsonIgnore]
    public virtual ICollection<TierMatrix> PricingTiers { get; set; }
    [JsonIgnore]
    public virtual ICollection<ContractDetail> Terms { get; set; }

находится на модели C#.

получается сопоставление этого с точки зрения модели контракта.

        HasMany(Model => Model.Members)
           .WithRequired(Model => Model.Contract);

        HasMany(Model => Model.MemberDetails)
           .WithOptional(Model => Model.Contract);

        HasMany(Model => Model.PricingTiers)
            .WithRequired(Model => Model.Contract);

        HasMany(Model => Model.Terms)
            .WithRequired(Model => Model.Contract);

устраняет необходимость в отображении коллекций с точки зрения этих четырех моделей. на самом деле, включая сопоставления внешнего ключа для Участника, MemberDetails, PricingTiers и Условия. сделал что-то с EF, где логика фреймворка решила, что ей нужен столбец Contract_ID в модели контракта, когда ничего не найдено.

Другие вопросы по тегам