Неверное имя столбца при доступе к дочерней таблице родительской структуры сущности c # - PullRequest
0 голосов
/ 03 июля 2019

В настоящее время я занимаюсь разработкой веб-приложения, которое содержит информацию о пользователях и информацию, связанную с кредитами.Я использую Asp.Net Identity для управления и обработки создания учетных записей пользователей в веб-приложении, и у меня есть несколько других таблиц, которые содержат информацию, непосредственно связанную с пользователем.

Я создал таблицу (IdentityProfile), котораясвязан с таблицей AspNetUsers в платформе Identity.Затем каждая таблица подключается к этой таблице как ссылка на функциональность учетной записи пользователя в приложении.См. Мой ERD:

Ссылка на диаграмму отношений сущностей

Таблицы IdentityProfile и UserProfile имеют следующее ссылочное ограничение: UserProfile -> IdentityProfile на основе поля первичного ключа ProfileId вкаждая таблица.

Я могу успешно создать запись профиля идентичности с соответствующей записью UserProfile:

public void CreateUserProfile(string title, string firstname, string lastname, DateTime dob, IdentityUser user)
    {         

        if(user != null) //Given the successfuly creation of a user account.
        {
            Guid profileId = user.Email.ConvertToMD5GUID();


            IdentityProfile identityProfile = new IdentityProfile //Manual Table Association Link (i.e. Between AspNetUsers Table and UserProfile Table).
            {
                Id = user.Id,
                ProfileId = profileId,
            };             

            identityProfile.UserProfile = new UserProfile
            {
                ProfileId = profileId,
                Title = title,
                FirstName = firstname,
                LastName = lastname,
                DOB = dob,
                DateRegistered = DateTime.Now,
                KBAFailed = false,
                CreditTrolleyRatingsRegistrationStatus = false,
                CreditActivityNotificationStatus = true,
                ThirdPartyPartnerNotificationStatus = true,
                CreditOffersNotificationStatus = true
            };

            ConsumerData.IdentityProfiles.Add(identityProfile);

            ConsumerData.SaveChanges();

        }

    }

Однако, когда дело доходит до доступа к созданной записи UserProfile, профиль Identity возвращаетсяnull и SqlException: недопустимое имя столбца 'UserProfile_ProfileId'.Неверное имя столбца 'UserProfile_ProfileId'.

public void CreateCreditFootprint()
    {

        IdentityProfile identityProfile = ConsumerData
           .IdentityProfiles
           .Single(profile
           => profile.Id == CurrentUserId);

        //An issue with the way in which the user profile is instantiated. 

        identityProfile.UserProfile.CreditFootprint = new CreditFootprint  //ERROR OCCURS ON THIS LINE - SPECICIALLY on identityProfile.UserProfile returing null.

        {

            CreditReportId = identityProfile.UserProfile.LastName.ToString().ConvertToMD5GUID(),
            CreditScore = short.Parse(new Random().Next(500, 710).ToString()), //Example score.
            CreditScoreStatus = "Good", //Example status.
            CumulativeDebt = new Random().Next(1000, 10000), //Example debt.
            LastRetrieved = DateTime.Now,

        };

        ConsumerData.SaveChanges();

    }

    //Migrate method over to UserAccountLink class.
    public void CreateCreditApplicationProfile()
    {
        IdentityProfile identityProfile = ConsumerData
           .IdentityProfiles
           .SingleOrDefault(profile
           => profile.Id == CurrentUserId);

        identityProfile.UserProfile.CreditApplicationProfile = new CreditApplicationProfile {

            ApplicationProfileId = identityProfile.UserProfile.FirstName.ToString().ConvertToMD5GUID(),
            ApplicationCount = 0,
            ApplicationsAcceptedCount = 0,
            ApplicationsDeclinedCount = 0,
            PendingApplicationsCount = 0
        };

        ConsumerData.SaveChanges();
    }

Все записи были успешно созданы в таблицах базы данных (то есть AspNetUsers, IdentityProfile (LINK) и UserProfile соответственно).Исключение выдается, когда я нахожу существующую запись IdentityProfile и пытаюсь получить доступ к ее ссылке UserProfile - см. Строку identityProfile.UserProfile.CreditApplicationProfile.

Любая помощь будет принята с благодарностью.

МногиеСпасибо,

Бен.

Вот мой исправленный код:

public partial class IdentityProfile
{
    public string Id { get; set; }

    [Required]
    [ForeignKey("UserProfile")]
    public System.Guid ProfileId { get; set; }


    public virtual UserProfile UserProfile { get; set; }
}

public partial class UserProfile
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public UserProfile()
    {
        this.IdentityProfiles = new HashSet<IdentityProfile>();
    }

    public System.Guid ProfileId { get; set; }
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public System.DateTime DOB { get; set; }
    public System.DateTime DateRegistered { get; set; }
    public bool RegistrationStatus { get; set; }
    public bool KBAFailed { get; set; }
    public bool CreditActivityNotificationStatus { get; set; }
    public bool ThirdPartyPartnerNotificationStatus { get; set; }
    public bool CreditOffersNotificationStatus { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]

    [InverseProperty("UserProfile")]
    public virtual ICollection<IdentityProfile> IdentityProfiles { get; set; }


    public virtual CreditApplicationProfile CreditApplicationProfile { get; set; }
    public virtual CreditFootprint CreditFootprint { get; set; }
}

Ошибка после обновления

Неверное имя столбца Пример ошибки

1 Ответ

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

Во-первых, для загрузки свойств навигации вы должны использовать .Include(), и если свойства навигации не включены в ваш запрос, вы получите значения NULL.

Во-вторых, ошибка Invalid column name 'UserProfile_ProfileId'определенно связано с вашей моделью и отображением свойств.Вы не упомянули о своей модели данных, но любой тип ошибок, содержащих сообщение «Неверное имя столбца», связан с вашими сопоставлениями (первичные из внешних ключей).

В случае Entity Framework Code First вы можете использовать код взрыва, основанный на вашей модели

public class IdentityProfile 
{
   [Required]
   [ForeignKey("Profile")]
   public System.Guid ProfileId { get; set; }

   public virtual UserProfile Profile { get; set; }
}

public class UserProfile 
{
    [InverseProperty("Profile")]
    public virtual ICollection<IdentityProfile> IdentityProfiles { get; set; }
}
...