访问父c#实体框架的子表时,列名无效

时间:2019-07-03 10:39:15

标签: c# sql asp.net entity-framework asp.net-identity

我目前正在开发一个Web应用程序,其中包含有关用户的信息和与信用有关的信息。我正在使用Asp.Net Identity来管理和处理Web应用程序中用户帐户的创建,还有其他几个表,这些表包含与用户直接相关的信息。

我已经建立了一个表(IdentityProfile),该表链接到Identity框架中的AspNetUsers表。然后,每个表都连接到该表,作为到应用程序中用户帐户功能的链接。请查看我的ERD:

Entity Relationship Diagram Link

IdentityProfile和UserProfile表具有以下引用约束:UserProfile->基于每个表中的ProfileId主键字段的IdentityProfile。

我能够使用相应的UserProfile记录成功创建一个Identity Profile记录:

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 Profile返回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; }
}

更新后错误

Invalid Column Name Error example

1 个答案:

答案 0 :(得分:0)

首先,为了加载导航属性,您必须使用.Include(),除非导航属性不包含在查询中,否则您将获得NULL值。

第二,Invalid column name 'UserProfile_ProfileId'的错误肯定与您的模型和属性映射有关。您没有提到数据模型,但是任何类型的包含“ Invalid column name”消息的错误都与您的映射有关(外键主键)。

首先使用Entity Framework代码,则可以根据您的模型使用代码打击功能

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; }
}