SqlClient.SqlException: недопустимое имя столбца ClassNameId При получении данных из Fluent API - PullRequest
4 голосов
/ 03 июля 2019

Я новичок в этом EF, я пытаюсь получить данные из таблицы Sql Db, и это дает мне ошибку типа invalid classNameId error.

public class ClassName
{
        [Key]
        [Display(Name = "Id:")]
        public int Id { get; set; }

        [Display(Name = "Created By:")]
        [Required(ErrorMessage = "Please enter created by.")]
        [StringLength(5, MinimumLength = 2)]
        public string CreatedBy { get; set; }
        public List<OtherClass> OtherClassList{ get; set; }
}

public class OtherClass
{

        [Column("Control")]
        [Display(Name = "Control:")]
        public String Control { get; set; }

        [ForeignKey("PID")]
        [Column("PID")]
        [Display(Name = "PID:")]
        public int PID{ get; set; }
}

DbContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ClassName>()
                .HasKey(p => p.Id);

            modelBuilder.Entity<OtherClass>()
            .HasKey(p=> new { p.Control, p.PID});
}

Я использую Fluent API для получения данных из MSSql.

1 Ответ

4 голосов
/ 03 июля 2019

Проблема в том, что здесь недопустимая аннотация ForeignKey

[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }

ForeignKey - это запутанный атрибут, поскольку он меняет значение аргумента в зависимости от того, где он применяется.При применении к свойству FK оно указывает имя свойства навигации.А при применении к свойству навигации оно указывает имя свойства FK.

В вашем случае оно применяется к свойству FK, но указывает то же имя свойства, поэтому оно просто игнорируется, а EF использует стандартное значение по умолчанию.имя свойства FK, связанного с отношением List<OtherClass> OtherClassList, поэтому вы получаете несуществующий столбец.

Чтобы устранить проблему, примените атрибут к свойству навигации другого класса (поскольку у вас нет свойства навигации в классе, которому нужен FK):

[ForeignKey(nameof(OtherClass.PID))]
public List<OtherClass> OtherClassList{ get; set; }

или (предпочтительно) настроить его с помощью свободного API:

modelBuilder.Entity<ClassName>()
    .HasMany(e => e.OtherClassList)
    .WithOne()
    .HasForeignKey(e => e.PID);

Если у вас есть свойство ссылочной навигации, в дополнение к вышеупомянутому решению для аннотирования данных, вы также можете использовать

    [ForeignKey(nameof(ClassName))]
    [Column("PID")]
    [Display(Name = "PID:")]
    public int PID{ get; set; }

или

    [ForeignKey(nameof(PID))]
    public ClassName ClassName { get; set; }

или свободный API .WithOne() должен быть изменен на .WithOne(e => e.ClassName).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...