[C#][MVC 5] Entitytype TestViewModel has no key defined

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Ik ben bezig om een nested view te maken van een database. Op basis van een uitklapmenu kan er informatie uit twee tables worden bekeken.

Ik heb een Model aangemaakt met daarin de twee tables
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using WebApplication1.Models;

namespace WebApplication1.ViewModel
{
    public class testDBViewModel
    {
        [Key]
        public Aanspreekpunten aanspreekpunt { get; set; }
        [Key]
        public List<test> test { get; set; }

    }
}


Aanspreekpunten en test zijn gedefinieerd in aparte classes:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace WebApplication1.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Aanspreekpunten
    {
        [Key]
        public int Employee_id { get; set; }
        public string Aanspreekpunt { get; set; }
        public string Functie { get; set; }
        public Nullable<decimal> Telefoonnummer { get; set; }
        public string E_mailadres { get; set; }
    }
}

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
namespace WebApplication1.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class test
    {
        [Key]
        public int test_id { get; set; }
        public string Naam { get; set; }
        public string IP_adres { get; set; }
        public string Protocol { get; set; }
        public Nullable<bool> Internet_access { get; set; }
        public string Locatie { get; set; }
        public string Afdeling { get; set; }
        public string Netwerkaansluiting { get; set; }
        public Nullable<decimal> Netwerksnelheid { get; set; }
        public string MAC_adres { get; set; }
        public string Functie { get; set; }
        public string Leverancier_code { get; set; }
        public string Aanspreekpunt { get; set; }
    }
}


Vanuit een controller probeer ik nu een view te genereren
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.ViewModel;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class AanspreekpuntController : Controller
    {
        // GET: Aanspreekpunt
        public ActionResult List()
        {
            List<TestDBViewModel> allOrder = new List<testDBViewModel>();

            // data context
            using (TestDBEntities dc = new TestDBEntities())
            {
                var o = dc.Aanspreekpunten.OrderByDescending(a => a.Aanspreekpunt);
                foreach (var i in o)
                {
                    var od = dc.test.Where(a => a.Aanspreekpunt.Equals(i.Aanspreekpunt)).ToList();
                    allOrder.Add(new TestDBViewModel { aanspreekpunt = i, test = od });
                }
            }

            return View(allOrder);
        }
    }
}



Ik krijg echter een error, namelijk
code:
1
2
3
TestDBViewModel: : EntityType 'TestDBViewModel' has no key defined. Define the key for this EntityType.

TestDBViewModels: EntityType: EntitySet 'TestDBViewModels' is based on type 'TestDBViewModel' that has no key defined.


Ik kreeg deze foutmelding ook over de individuele classes (test, Aanspreekpunten). Dit heb ik opgelost door de reference using System.ComponentModel.DataAnnotations toe te voegen, en boven elementen van de tables [Key] te zetten door zo een sleutel te definiëren. Echter na het toevoegen van een sleutel in TestDBViewModel.cs blijf ik de error krijgen.

Waar kan ik de sleutel toekennen?

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 14:36
amx schreef op dinsdag 26 mei 2015 @ 12:23:
...verhaal uit topicstart...
Tenzij je een key hebt die bestaat uit zowel een list als een aanspreekpunt, heb je niet tweemaal een [Key]-annotation nodig. Voor deze class:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using WebApplication1.Models;


namespace WebApplication1.ViewModel
{
    public class testDBViewModel
    {
        [Key]
        public Aanspreekpunten aanspreekpunt { get; set; }
        [Key]
        public List<test> test { get; set; }

    }
}


Zou ik dus slechts één key aanmaken. Of is het een composite key gemaakt uit een aanspreekpunt en een list-item?

Edit: Bedenk dat een Key slaat op een Primary key in je DB, of eventueel een foreign key (maar een Primary Key is normaalgesproken altijd nodig voor Entity Framework om een SaveOrUpdate (of iets soortgelijks, bijvoorbeeld een normale update) te kunnen uitvoeren, om één enkele record te kunnen targeten door een unieke waarde te gebruiken die die record in de DB aanwijst)

[ Voor 19% gewijzigd door Merethil op 26-05-2015 13:06 ]


Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Het maakt niet uit of ik 0, 1, of 2 keer [key] erbij zet. Ik krijg steeds dezelfde foutmelding.

[edit]

via server explorer kan ik de tables middels SQL een primary key geven.
Beide partial classes hebben een primary key.

[ Voor 41% gewijzigd door amx op 26-05-2015 13:09 ]


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 14:36
amx schreef op dinsdag 26 mei 2015 @ 13:07:
Het maakt niet uit of ik 0, 1, of 2 keer [key] erbij zet. Ik krijg steeds dezelfde foutmelding.
Dan is 't waarschijnlijk omdat je tabel geen unieke key heeft in je code: Je hebt alleen een foreign field (Aanspreekpunten) en een List van items. Entity Framework verwacht een unique identifier per record in je tabel en dat kan dus niet bij iets wat foreign is. Tenzij deze foreign echt maar éénmaal in de DB mag voorkomen natuurlijk.

Je kan bijvoorbeeld dit ervan maken:
C#:
1
2
3
4
5
6
7
8
9
10
namespace WebApplication1.ViewModel
{
    public class testDBViewModel
    {
        [Key]
        public int id { get; set; }
        public Aanspreekpunten aanspreekpunt { get; set; }
        public List<test> test { get; set; }
    }
}


Moet je alleen wel in je tabel een id-kolom toevoegen en deze het liefst Auto Incremented maken. Daardoor heb je per rij een standaard unieke identifier en kan je dus update-queries uitvoeren. Tot die tijd gaat Entity Framework waarschijnlijk niet goed overweg kunnen met je DB-opbouw.

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Dank je voor je hulp. Het werkt, maar nog niet zoals ik wil.
Ik kan nu een view toevoegen. Maar als ik de view verwijder en het nogmaals probeer,
krijg ik een error

code:
1
2
3
4
Error

There was an error running the selected code generator: 
Unable to retrieve metadata for 'Webapplication1.viewModel.TestDBViewModel'. '


[edit]

Ik heb gekeken naar de metadata in de aanwezige connection string in web.config.
Daar staan de volgende verwijzingen:

code:
1
2
3
4
5
6
<connectionStrings>
    <add name="TestDBEntities" connectionString="metadata=res://*/Models.TestDB.csdl
|res://*/Models.TestDB.ssdl|res://*/Models.TestDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|
DataDirectory|
\TestDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>


Dit verwijst naar de Models folder, en dit is ook de locatie van mijn TestDB.edmx bestand (ik werk volgens Database First)

Is er nog een manier om metadata aan te spreken tijdens aanmaken van een view?

[ Voor 54% gewijzigd door amx op 26-05-2015 15:37 ]


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 14:36
amx schreef op dinsdag 26 mei 2015 @ 15:14:
Dank je voor je hulp. Het werkt, maar nog niet zoals ik wil.
Ik kan nu een view toevoegen. Maar als ik de view verwijder en het nogmaals probeer,
krijg ik een error

code:
1
2
3
4
Error

There was an error running the selected code generator: 
Unable to retrieve metadata for 'Webapplication1.viewModel.TestDBViewModel'. '


[edit]

Ik heb gekeken naar de metadata in de aanwezige connection string in web.config.
Daar staan de volgende verwijzingen:

code:
1
2
3
4
5
6
<connectionStrings>
    <add name="TestDBEntities" connectionString="metadata=res://*/Models.TestDB.csdl
|res://*/Models.TestDB.ssdl|res://*/Models.TestDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|
DataDirectory|
\TestDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>


Dit verwijst naar de Models folder, en dit is ook de locatie van mijn TestDB.edmx bestand (ik werk volgens Database First)

Is er nog een manier om metadata aan te spreken tijdens aanmaken van een view?
Wat probeer je precies te doen dan? Ik snap niet helemaal wat je aan het toevoegen en verwijderen bent. Ben je een view in de DB aan het maken met je code? Of maak je gewoon een link tussen twee tabellen via een cross-reference-table en probeer je daar op te queryen?

Acties:
  • 0 Henk 'm!

  • amx
  • Registratie: December 2007
  • Laatst online: 13-10 22:39
Ik zat inderdaad al bij de view. Ik heb alle onderdelen uit het model nog eens verwijderd en opnieuw toegevoegd.

De data laadde dacht ik aanvankelijk niet volledig. Dat kwam echter doordat ik bepaalde velden zelf nog niet ingevuld had in de database. Vandaar dat ik de view nog een tweede keer probeerde te genereren.

Na er nog eens naar gekeken te hebben, lukt het vooralsnog prima.

Dank voor je hulp :)
Pagina: 1