gpt4 book ai didi

c# - Dotnet 核心与 Sqlite : table relationships

转载 作者:行者123 更新时间:2023-12-02 07:29:01 24 4
gpt4 key购买 nike

我已经在 dotnet core 中使用 sqlite 数据库启动了一个项目。我想了解表之间的关系是如何工作的。

这里是上下文和表格:

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

public DbSet<Joke> Jokes { get; set; }
public DbSet<User> Users { get; set; }
}

public class Joke
{
public int JokeId { get; set; }
public string Description { get; set; }
public User Author { get; set; }
public int Upvotes { get; set; }
public int Downvotes { get; set; }
}

public class User
{
public int UserId { get; set; }
public string Name { get; set; }
}

如果数据库为空,我会在应用程序启动时初始化数据库,如下所示:

context.Jokes.AddRange(
new Joke
{
Description = "Perlinpinping",
Author = new User
{
Name = "Claire"
},
Downvotes = 9354,
Upvotes = 0
},
new Joke
{
Description = "Random Joke",
Author = new User
{
Name = "Robouste"
},
Downvotes = 0,
Upvotes = 78954
}
);

当我检查数据库时,我发现系统足够智能,可以将用户添加到 User 表中,并仅将 ID 放入 Joke 表中。

Joke table

User table

到目前为止一切顺利。现在的问题。当我检索笑话时,作者为空。

[HttpGet]
public IEnumerable<Joke> GetJokes()
{
return _context.Jokes;
}

Json 结果:

{"jokeId":1,"description":"Perlinpinping","author":null,"upvotes":0,"downvotes":9354}

当我尝试使用 http post 请求添加新笑话时,出现唯一约束错误:

SqliteException: SQLite Error 19: 'UNIQUE constraint failed: Users.UserId'.

这是有效负载请求:

{author: {userId: 2, name: "Robouste"}, description: "sdfsdfsd"}

行动:

[HttpPost]
public async Task<IActionResult> PostJoke([FromBody] Joke joke)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

_context.Jokes.Add(joke);
await _context.SaveChangesAsync();

return CreatedAtAction("GetJoke", new { id = joke.JokeId }, joke);
}

谁能解释一下我做错了什么吗?我认为这两个问题都与同一原因有关,但我不明白为什么。

最佳答案

EF Core 尚不支持您的关系的延迟加载。

所以你需要eager loading您与使用 Inlude 方法的关系:

[HttpGet]
public IEnumerable<Joke> GetJokes()
{
return _context.Jokes.Include(joke => joke.Author);
}

或者使用explicit loading.

要解决您的更新问题,您应该查看有关使用 disconnected entites 的文档

在您的场景中,最简单的“修复”是从数据库中查找作者并将其分配给 joke 对象,然后再添加到上下文:

    public async Task<IActionResult> PostJoke([FromBody] Joke joke)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var author = _context.Find<User>(joke.Author.UserId);
if (author != null)
{
//existing author
joke.Author = author;
}
_context.Jokes.Add(joke);
await _context.SaveChangesAsync();

return CreatedAtAction("GetJoke", new { id = joke.JokeId }, joke);
}

关于c# - Dotnet 核心与 Sqlite : table relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47941840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com