Entity Framework - Invalid Column Name '*_ID"

后端 未结 15 1597
长发绾君心
长发绾君心 2020-11-29 21:30

I\'ve narrowed this down to some issue between Code First and Database first EF, but I\'m not sure how to fix it. I\'ll try to be as clear as I can, but I honestly am missin

相关标签:
15条回答
  • 2020-11-29 21:56

    I also had this problem and it seems like there are a few different causes. For me it was having an id property mistakenly defined as int instead of long in the parent class that contained a navigation object. The id field in the database was defined as bigint which corresponds to long in C#. This didn't cause a compile time error but did cause the same run time error as the OP got:

    // Domain model parent object
    public class WidgetConfig 
    {
        public WidgetConfig(long id, int stateId, long? widgetId)
        {
            Id = id;
            StateId = stateId;
            WidgetId = widgetId;
        }
    
        private WidgetConfig()
        {
        }
    
        public long Id { get; set; }
    
        public int StateId { get; set; }
    
        // Ensure this type is correct
        public long? WidgetId { get; set; } 
    
        public virtual Widget Widget { get; set; }
    }
    
    // Domain model object
    public class Widget
    {
        public Widget(long id, string name, string description)
        {
            Id = id;
            Name = name;
            Description = description;
        }
    
        private Widget()
        {
        }
    
        public long Id { get; set; }
    
        public string Name { get; set; }
    
        public string Description { get; set; }
    }
    
    // EF mapping
    public class WidgetConfigMap : EntityTypeConfiguration<WidgetConfig>
    {
        public WidgetConfigMap()
        {
            HasKey(x => x.Id);
            ToTable(nameof(WidgetConfig));
            Property(x => x.Id).HasColumnName(nameof(WidgetConfig.Id)).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            Property(x => x.StateId).HasColumnName(nameof(WidgetConfig.StateId));
            Property(x => x.WidgetId).HasColumnName(nameof(WidgetConfig.WidgetId));
        }
    }   
    
    // Service
    public class WidgetsService : ServiceBase, IWidgetsService
    {
        private IWidgetsRepository _repository;
    
        public WidgetsService(IWidgetsRepository repository)
        {
            _repository = repository;
        }
    
        public List<WidgetConfig> ListWithDetails()
        {
            var list = _repository.ListWithDetails();
    
            return new WidgetConfigMapping().ConvertModelListToDtoList(list).ToList();
        }
    }   
    
    // Repository
    public class WidgetsRepository: BaseRepository<WidgetConfig, long>, IWidgetsRepository
    {
        public WidgetsRepository(Context context)
            : base(context, id => widget => widget.Id == id)
        {
        }
    
        public IEnumerable<WidgetConfig> ListWithDetails()
        {
            var widgets = Query
                .Include(x => x.State)
                .Include(x => x.Widget);
    
            return widgets;
        }
    }
    
    0 讨论(0)
  • 2020-11-29 21:57

    If you have foreign key references to the same table more than once, then you can use InverseProperty

    Something like this-

    [InverseProperty("MyID1")]
    public virtual ICollection<MyTable> set1 { get; set; }
    [InverseProperty("MyID2")]
    public virtual ICollection<MyTable> set2 { get; set; }
    
    0 讨论(0)
  • 2020-11-29 21:58

    For me, it happened because of EF's pluralization issues. For tables that ends with something like "-Status", EF thinks that it's singular is "-Statu". Changing the entity and DB table name to "-StatusTypes" fixed it.

    This way, you would not need to rename entity models everytime it gets updated.

    0 讨论(0)
  • 2020-11-29 22:01

    For me (using Visual Studio 2017 and the database-first model under Entity Framework 6.1.3), the problem went away after restarting Visual Studio and Rebuilding.

    0 讨论(0)
  • 2020-11-29 22:05

    In my case the cause for this problem was a missing FOREIGN KEY constraint on a migrated database. So the existing virtual ICollection was not loaded successfully.

    0 讨论(0)
  • 2020-11-29 22:06

    In my case my seed method data was still calling a table column which had been dropped in a previous migration. Double check your mappings if you are using Automapper.

    0 讨论(0)
提交回复
热议问题