[C#/.Net Core/EF/SQLite] Tables worden niet aangemaakt

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 23-04 18:36
Hallo iedereen

Ik ben sinds vandaag gestart met Entity Framework/SQLite/.Net Core

Nu probeer ik een 13 in een dozijn API te bouwen om wat te testen.
Concreet probeer ik een "User" toe te voegen aan de database.

User class:
code:
1
2
3
4
5
6
public class User
    {
        public string Id { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
    }


UserContext:
code:
1
2
3
4
5
6
7
8
9
public class UserContext : DbContext
    {
        public UserContext(DbContextOptions<UserContext> options)
            : base(options)
        {
        }

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


En dan nog een volledig auto-generated controller class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
[Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly UserContext _context;

        public UsersController(UserContext context)
        {
            _context = context;
        }

        // GET: api/Users
        [HttpGet]
        public async Task<ActionResult<IEnumerable<User>>> GetUsers()
        {
            return await _context.Users.ToListAsync();
        }

        // GET: api/Users/5
        [HttpGet("{id}")]
        public async Task<ActionResult<User>> GetUser(string id)
        {
            var user = await _context.Users.FindAsync(id);

            if (user == null)
            {
                return NotFound();
            }

            return user;
        }

        // PUT: api/Users/5
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPut("{id}")]
        public async Task<IActionResult> PutUser(string id, User user)
        {
            if (id != user.Id)
            {
                return BadRequest();
            }

            _context.Entry(user).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!UserExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

        // POST: api/Users
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPost]
        public async Task<ActionResult<User>> PostUser(User user)
        {
            _context.Users.Add(user);
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (UserExists(user.Id))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtAction("GetUser", new { id = user.Id }, user);
        }

        // DELETE: api/Users/5
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteUser(string id)
        {
            var user = await _context.Users.FindAsync(id);
            if (user == null)
            {
                return NotFound();
            }

            _context.Users.Remove(user);
            await _context.SaveChangesAsync();

            return NoContent();
        }

        private bool UserExists(string id)
        {
            return _context.Users.Any(e => e.Id == id);
        }
    }


In mijn startup class definieer ik ook de de databankconnectie:
code:
1
2
3
4
5
public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<UserContext>(opt => opt.UseSqlite("Filename=Controller.db"));
            services.AddControllers();
}


Nu, als ik de code test, wordt de database wel aangemaakt, maar op het moment dat ik een endpoint aanspreek, krijg ik telkens de melding dat de tabel "Users" niet bestaat.

Ik ben vrij nieuw met het Code First principe, maar ik had gedacht dat deze tabel on the fly aangemaakt zou worden bij het aanspreken van een endpoint die met de UserContext te maken heeft.

Ik dacht dat ik eventueel iets zou kunnen doen met de options instance in de constructor, maar daar wordt ik ook niet veel wijzer van.

Hoe specifieer ik het aanmaken van tables?

Bedankt voor de input!

Beste antwoord (via Carharttguy op 22-06-2021 08:49)


  • Marco1994
  • Registratie: Juli 2012
  • Laatst online: 22:37
Je bent een stap vergeten, namelijk het aanmaken van een migratie. Dit detecteert dmv een snapshop welke tabellen nog niet in je database bekend zijn en maakt hier sql code voor aan.
https://docs.microsoft.co...aging-schemas/migrations/

Alle reacties


Acties:
  • Beste antwoord
  • +6 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Laatst online: 22:37
Je bent een stap vergeten, namelijk het aanmaken van een migratie. Dit detecteert dmv een snapshop welke tabellen nog niet in je database bekend zijn en maakt hier sql code voor aan.
https://docs.microsoft.co...aging-schemas/migrations/

Acties:
  • +2 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 23-04 18:36
Thanks @Marco1994 , die stap was ik inderdaad niet tegengekomen. Alles werkt perfect!