Avatar billede simsen Mester
04. februar 2021 - 19:37 Der er 5 kommentarer og
2 løsninger

DateOfBirth fejler

Nu har jeg forsøgt at spørge et andet sted, hvor jeg fik skældud over at skjule et eller andet (som jeg så ikke ved hvad er).

Jeg får 3 fejl (på Error listen).
2 fejl med denne kode
Severity    Code    Description    Project    File    Line    Suppression State
Error    CS0012    The type 'DateTime' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.    1_Views_EmployeePart011_Index.cshtml    C:\Users\anjas\source\repos\MySecondMvc\MySecondMvc\Views\EmployeePart011\Index.cshtml    30    Active
og
Severity    Code    Description    Project    File    Line    Suppression State
Error    CS1061    'IEnumerable<Employee>' does not contain a definition for 'DateOfBirth' and no accessible extension method 'DateOfBirth' accepting a first argument of type 'IEnumerable<Employee>' could be found (are you missing a using directive or an assembly reference?)    1_Views_EmployeePart011_Index.cshtml    C:\Users\anjas\source\repos\MySecondMvc\MySecondMvc\Views\EmployeePart011\Index.cshtml    30    Active

Jeg har en BusinessLayer hvor jeg har 2 klasser;

public class EmployeeBusinessLayer
    {
        public IEnumerable<Employee> Employees
        {
            get
            {
                string connectionString = ConfigurationManager.ConnectionStrings["EmployeeContext"].ConnectionString;

                List<Employee> employees = new List<Employee>();

                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand("spEmployees_GetAll", con)
                    {
                        CommandType = CommandType.StoredProcedure
                    };
                    con.Open();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        Employee employee = new Employee
                        {
                            EmployeeId = (int)(rdr["EmployeeId"]),
                            Name = rdr["Name"].ToString(),
                            Gender = rdr["Gender"].ToString(),
                            City = rdr["City"].ToString(),
                            DepartmentId = (int)(rdr["DepartmentId"])
                        };
                        if (!(rdr["DateOfBirth"] is DBNull))
                        {
                            //employee.DateOfBirth = rdr["DateOfBirth"].ToString();
                            employee.DateOfBirth = Convert.ToDateTime(rdr["DateOfBirth"]);
                        }

                        employees.Add(employee);
                    }
                }

                return employees;
            }
        }

Og
namespace BusinessLayer
{
    [Table("tblEmployees")]
    public class Employee
    {
        public int EmployeeId { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string City { get; set; }
        public DateTime DateOfBirth { get; set; }
        public int DepartmentId { get; set; }
    }
}

Nu laver jeg så en Controller;
public class EmployeePart011Controller : Controller
    {
        // GET: EmployeePart011
        public ActionResult Index()
        {
            EmployeeBusinessLayer employeeBusinessLayer = new EmployeeBusinessLayer();
            List<Employee> employees = employeeBusinessLayer.Employees.ToList();

            return View(employees);
        }
    }

Og til sidst et view;

@model IEnumerable<BusinessLayer.Employee>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Gender)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.City)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.DateOfBirth)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.DepartmentId)
            </th>
            <th></th>
        </tr>
   
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Gender)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.City)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateOfBirth)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DepartmentId)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.EmployeeId }) |
                @Html.ActionLink("Details", "Details", new { id=item.EmployeeId }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.EmployeeId })
            </td>
        </tr>
    }
   
    </table>
</body>
</html>


Alle 3 fejl linker til selve viewet og model.DateOfBirth og item.DateOfBirth

Når jeg laver en run to cursor så gennemgår den public IEnumerable<Employee> Employees uden at fejle. det er først når jeg får vist siden, den så fejler med følgende
CS1061: 'IEnumerable<Employee>' does not contain a definition for 'DateOfBirth' and no accessible extension method 'DateOfBirth' accepting a first argument of type 'IEnumerable<Employee>' could be found (are you missing a using directive or an assembly reference?)

Jeg har ikke vist alle klasser under EmployeeBusinessLayer - men det er Tilføj og slet funktioner.

Det skal også siges, at I dag har jeg brugt RIGTIG mange timer på en fejl HTTP Error 500.0 - ANCM In-Process Handler Load Failure. Det der skal til hver gang, er at jeg fjerner NetCore.Platforms og tilføjer den igen gennem NuGetSolution. Men den bliver ved med at markere NetCore delen med gul trekant i BusinessLayer projektet/klassen. Denne her fejl, har jeg dog kun haft i dag, efter jeg opdaterede VS.

En anden ting, jeg har lagt mærke til, det er at der står netstandard version=2.0.0.0 men men jeg bruger altså netstandard 2.0.3. Jeg kan ikke finde den 2.0.0.0 nogen steder.

Det skal tilføjes, at laver jeg DateOfBirth om til en streng, så er der ingen ko på isen nogen steder. Den går glat igennem og viser listen med datoen.

Jeg håber, det giver mening, ellers spørg endelig :-)

Vh
Simsen :-)
Avatar billede arne_v Ekspert
04. februar 2021 - 20:15 #1
"The type 'DateTime' is defined in an assembly that is not referenced."

is a weird one, because that type is definitely there.

Most likely the problem is that it is present in one .NET flavor while some assembly expects it in another .NET flavor.

Altsaa noget .NET Framework <> .NET Core <> .NET standard.
Avatar billede simsen Mester
04. februar 2021 - 20:37 #2
Nu bliver jeg forvirret.

Min BusinessLayer er en class fil - så vel ikke noget, der der kan komme indover?

Så er der min MySecondMvc er en asp.net mvc controller.

Det skal dog tilføjes at jeg (kan ikke huske om det var den her solution eller en anden - jeg har prøvet RIGTIG mange ting) på et tidspunkt havde et projekt som var en net core projekt (men manglede så min web.config fil), så den slettede jeg også fysisk og lavede et nyt projekt = MysecondMvc.

Hvis jeg må, vil jeg vende frygtelig tilbage i morgen og så prøve at lave ny solution/projekter?

Vh
Simsen
Avatar billede simsen Mester
04. februar 2021 - 20:42 #3
Der er noget, der lige slår mig;

I BusinessLayer klassen, har jeg jo min EmployeeBusinessLayer. Her har jeg en data tilgang til db

public IEnumerable<Employee> Employees

Her bruger jeg så Employee class til at lægge de rækker, jeg henter ind fra db. Men i min Employee har jeg ingen IEnumerable - altså hvordan får den så fat i, at det her er ikke en enkelt men en række af Employees? Er det bare IEnumerable i Index filen, der fortæller det? Håber det giver mening - altså spørgsmålet :-)
Avatar billede arne_v Ekspert
05. februar 2021 - 01:38 #4
DateTime problemet er et opsaetninsg problem som intet har med dine klasser at goere.
Avatar billede arne_v Ekspert
05. februar 2021 - 01:41 #5
Med hensyn til at faa laest ind fra databasen til din liste, saa afhaenger det af hvprdan du tilgaar databasen.

Bruger du ORM f.eks. EF, saa kan det ske helt automaisk.

Bruger du ADO.NET og SQL, saa er du noedte til ar lave en LIst<Employee>, laese alle raekker og indsaette i den List og saa gemme den List i din "management klasse".
Avatar billede simsen Mester
05. februar 2021 - 15:11 #6
Jeg har været ved at opgive fuldstændig. Jeg har i dag afinstalleret og reinstalleret VS2019. Jeg har startet ny solution og nye projekter, som jeg bare ved i tryk på ved, at de passer sammen.

Så tænkte jeg lige, jeg endnu engang (nok den 127. gang) lige ville tjekke om der var noget hjælp og det var der på google.

Skriver jeg følgende ind i web.config under compilation, så fejler den ikke længere. Der går lige en 3-4 minutter før errors også forsvnder på error listen, men jeg kan sagtens køre siden og ikke få fejl.

<assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral,
            PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>

Tak for din altid store hjælp Arne :-)
Avatar billede arne_v Ekspert
05. februar 2021 - 15:35 #7
Jeg undrer mig stadig lidt over hvorfor det er noedvendigt, men dependencies kan godt vaere lidt tricky nogen gange.

Har du ogsaa faaet styr paa database adgangen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester