【问题标题】:Why Entity Framework doesn't initialize field?为什么实体框架不初始化字段?
【发布时间】:2020-09-03 13:35:19
【问题描述】:

我创建了两个实体,将它们添加到数据上下文中,在它们之间创建了关系,执行了迁移。注册用户后,应用程序在数据库中创建了他的记录,并与默认图像建立了连接。在下一个请求期间 - ProfilePictureId 由正确的值初始化,但 ProfilePicture 为空。

用户.cs

public class User: IdentityUser
{
    public int? ProfilePictureId { get; set; }
    public virtual Image ProfilePicture { get; set; }
}

图像.cs

public class Image
{
    public int Id { get; set; }
    public string Filename { get; set; }
}

RegisterModel.cshtml.cs

[AllowAnonymous]
public class RegisterModel : PageModel
{
    private readonly SignInManager<User> _signInManager;
    private readonly UserManager<User> _userManager;
    private readonly UserSettings _userSettings;
    private readonly ApplicationDbContext _dbContext;
    private readonly ILogger<RegisterModel> _logger;
    private readonly IEmailSender _emailSender;

    public RegisterModel(
        UserManager<User> userManager,
        SignInManager<User> signInManager,
        IOptions<UserSettings> userSettings,
        ApplicationDbContext dbContext,
        ILogger<RegisterModel> logger,
        IEmailSender emailSender)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _userSettings = userSettings.Value;
        _dbContext = dbContext;
        _logger = logger;
        _emailSender = emailSender;
    }

    // ...

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        // ...

        if (ModelState.IsValid)
        {
            // var user = new User ...

            SetUserDefaultParams(user);

            var result = await _userManager.CreateAsync(user, Input.Password);

            if (result.Succeeded)
            {
                // ...
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        // If we got this far, something failed, redisplay form
        return Page();
    }

    private void SetUserDefaultParams(User user)
    {
        // ...
        if (_userSettings != null)
        {
            var image = _dbContext.Images
                .Where(
                i => i.Filename == _userSettings.DefaultProfilePicture)
                .FirstOrDefault();
            user.ProfilePicture = image; // this always returns the desired value (not null)
        }
        _userManager.UpdateAsync(user).Wait();
    }
}

我希望 ProfilePicture 在_LoginPartial.cshtml Razor-page 中不为空:

@inject UserManager<User> UserManager
@{
    var user = UserManager.GetUserAsync(User).Result;
    var pathToProfilePicture = string.Empty;

    if (user != null)
    {
        pathToProfilePicture = 
            $"../../Resources/Images/{user.ProfilePicture.Filename}"; // here 
// I get NullReferenceException
    }
}

【问题讨论】:

  • @GertArnold 问题已更新

标签: c# .net entity-framework asp.net-core


【解决方案1】:

尝试在您的声明中添加.Include(e =&gt; e.ProfilePicture)https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多