繁体   English   中英

实体框架查找外键值并更新行

[英]Entity Framework find foreign key value and update row

我有 2 张表UserConnections User登录时,如果用户存在,我想存储连接并更新行,如果不在连接表中,则创建。

public class UserContext : DbContext
{
    public UserContext(DbContextOptions<UserContext> options) : base(options) { }

    public DbSet<User>? Users { get; set; }
    public DbSet<Connection>? Connections { get; set; }
}

public class User
{
    [Key]
    [Required]
    public string? UserName { get; set; }
    public string? Password { get; set; }
    public string? Email { get; set; }
    public DateOnly Date { get; set; }
    public int? ChessScore { get; set; }
    public string? Group { get; set; }
    [Required]
    public ICollection<Connection>? Connections { get; set; }
}

public class Connection
{
    [Required]
    public string? ConnectionID { get; set; }
    [Required]
    public string? UserAgent { get; set; }
    [Required]
    public bool Connected { get; set; }
    ( **Foreign key column** )            <---- query this column
}

我的问题是,如果找到特定值,我如何能够查询Connection ( Username ) 中的外键列并更新该行?

我现在的代码

if (user == null)
{
    user = new User
               {
                   UserName = name,
                   Connections = new List<Connection>()
               };
    db.Users.Add(user);
}

// var result1 = db.Users.Include(m => m.Connections);
            
var result = db.Connections.SingleOrDefault(b => b.UserName == name);

if (result1 != null)
{
    result.ConnectionID = Context.ConnectionId;
    result.UserAgent = Context.GetHttpContext()?.Request.Headers["User-Agent"];
    result.Connected = true;
}
else
{
    user.Connections.Add(new Connection
                {
                    ConnectionID = Context.ConnectionId,
                    UserAgent = Context.GetHttpContext()?.Request.Headers["User-Agent"],
                    Connected = true
                });
}

db.SaveChanges();

我无法添加Username { get; set; } Username { get; set; } Username { get; set; }到 model 没有它抱怨影子 state 和失败(理解为什么这样做)

试试下面的代码。 想法是用它的连接加载用户 - 正常的 EF 流。

var user = db.Users
  .Include(u => u.Connections) // you can apply filter here
  .Where(u => u.UserName = name)
  .FirstOrDefault();

if (user == null)
{
    user = new User
    {
        UserName = name,
        Connections = new List<Connection>()
    };
    db.Users.Add(user);
}

var connection = user.Connections.FirstOrDefault();
if (connection == null)
{
    connection = new Connection();
    user.Connections.Add(connection);
}

connection.ConnectionID = Context.ConnectionId;
connection.UserAgent = Context.GetHttpContext()?.Request.Headers["User-Agent"];
connection.Connected = true;

db.SaveChanges();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM