EF Core 3.0其他文件映射和更新

问题描述 投票:0回答:1

我在映射和更新其他字段时遇到问题。

让我们上简单的课

public class User
{
    [Key]
    public Guid Id { get; set; }

    public string SameField { get; set; }
    public AuxClass AuxClass { get; set; }    
}

public class AuxClass
{
    public Guid Id { get; set; }

    public string? AuxField { get; set; }

    public Guid UserId { get; set; }
    public User User { get; set; }
}
...
DbSet<User> UserDb { get; set; }

我希望这样的请求

var tst = context.UserDb.AsNoTracking().FirstOrDefaultAsync();

返回这样的对象:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = null
}

但是我得到

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = 
    {
        Id = "00000000-0000-0000-0000-000000000000",
        AuxField = null,
        UserId = "00000000-0000-0000-0000-000000000000",
        User = null
    }
}

所以,第一个问题-为什么?第二个问题-如何配置上下文不要通过请求创建这样的对象?

和第三个问题。

假设我有类似User类的对象:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = 
    {
        Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A83",
        AuxField = "lalala",
        UserId = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
        User = User
    }
}

我发出一个请求var tst = context.UserDb.AsNoTracking().FirstOrDefaultAsync();,因此,我从数据库中获得了该对象的一部分并进行了更改:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala12345",
    AuxClass = null
}

我想在数据库中更新此对象。我想写这样的代码

context.UserDb.Update(tst);
await context.SaveChangesAsync(true);

不删除数据库中存储的对象中的AuxClass字段。怎么可能

谢谢。

.net-core entity-framework-core
1个回答
0
投票

您应该将关系成员定义为虚拟成员,并且所有问题都已解决:

public class User
{
    [Key]
    public Guid Id { get; set; }

    public string SameField { get; set; }
    public virtual AuxClass AuxClass { get; set; }    
}

public class AuxClass
{
    public Guid Id { get; set; }

    public string? AuxField { get; set; }

    public Guid UserId { get; set; }
    public virtual User User { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.