Entity Framework MVC 3 в C #. Отказывается добавлять значения в таблицу «Персона» и генерируется «Люди» (?) - PullRequest
0 голосов
/ 30 сентября 2011

При генерации модели обнаружена одна или несколько ошибок проверки:

System.Data.Edm.EdmEntityType: : EntityType 'Person' has no key defined. Define the key for this EntityType.
System.Data.Edm.EdmEntitySet: EntityType: The EntitySet People is based on type Person that has no keys defined.

---> Person.cs (в моделях)

 using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Web;
   using System.ComponentModel.DataAnnotations;

   namespace Portal.Models
    {
    public class Person
        {
            [Required]
            public int UserId;

            [Required]
            public string FirstName;

        [Required]
        public string LastName;

        }
    }

-> PersonDB.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace Portal.Models
{

    public class PersonDB : DbContext
    {
        public DbSet<Person> Person { get; set; }
    }
}

-> web.config connectionstring.

  <connectionStrings>

    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|ASPNETDB.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />

      <add name="PersonDB"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|ASPNETDB.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />

  </connectionStrings>

-> AccountController (пытается добавить значения в случае успешного создания учетной записи)

 PersonDB db = new PersonDB();
                    Person p = new Person {UserId = 1, FirstName = "hej", LastName = "padig"};
                    db.Person.Add(p);
                    db.SaveChanges();

Здесь я просто пытаюсь добавить некоторые тестовые значения в таблицу, таблица состоит из UserId с is int и nvarchar FirstName, LastName.

Откуда приходят эти люди в ошибке проверки? «EntitySet People основан на типе Person» << Это сводит меня с ума. </p>

Не понимаю, я потратил слишком много времени на это, что по сути является просто вставкой в ​​запрос ...

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Во-первых, каждому типу сущности нужен ключ.Если вы получили свойство с именем Id или 'EntityClassName'Id, оно выбрано в качестве ключа по умолчанию (другими словами, это соглашение ).Поскольку у вас нет свойства с именем Id или PersonId - у вас есть только UserId, вы получите первую ошибку проверки, что у Person нет ключа.Добавьте атрибут [Key] в UserId или используйте свободный интерфейсный код

//Inside PersonDB class
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Person>().HasKey(x => x.UserId);
    }

PluralizingEntitySetNameConvention - это еще один пример соглашений.Entity Framework использует это соглашение по умолчанию и делает имена наборов сущностей множественными.Если вы не хотите использовать это соглашение, вы можете удалить его. Здесь - список всех соглашений по умолчанию.Вы можете удалить нежелательное соглашение, позвонив по номеру

//Inside PersonDB class
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().HasKey(x => x.UserId);

....

        modelBuilder.Conventions.Remove<ConventionTypeNameFromTheLinkAbove>();
    }

Если вы выглядите осторожно, вы можете увидеть, что KeyAttributeConvention также является одним из встроенных соглашений по умолчанию.

1 голос
/ 30 сентября 2011

«Люди» - это имя, которое было автоматически присвоено EntitySet при создании вашей модели. EntityFramework пытается выполнить некоторое автоматическое множественное добавление имен таблиц / сущностей, поэтому она решила, что строка в таблице Person была «Person», а вся таблица должна указывать на хранилище с именем «People».

Вам нужно сделать db.People.Add (p);

Вам также необходимо повторно посетить таблицу Person в вашей базе данных, потому что EntityFramework не смог легко определить ключи, определенные в этой таблице (которые необходимы EntityFramework для поддержания состояния вашего хранилища / таблицы при внесении изменений во внутреннюю базу данных). ObjectStateManager и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...