Тип сущности <type>не является частью модели из текущего контекста - PullRequest
1 голос
/ 10 апреля 2019

Я получаю эту ошибку (An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code The entity type tblMessage is not part of the model for the current context.) и пробовал исправления, которые я нашел в Интернете, но, похоже, они не помогли. Я также сделал что-то похожее для другой таблицы базы данных ранее в коде.

Я пытаюсь получить сообщения из таблицы базы данных, которая называется tblMessages.

Конструктор:

public JsonResult ConversationWithContact(int contact)
        {
            if (Session["UserID"] == null)
            {
                return Json(new {status = "error", message = "User is not logged in"});
            }

            //var currentUser = (Models.tblUser)Session["UserID"];

            var conversations = new List<Models.tblMessage>();

            using (var db = new Models.ChatContext())
            {
                int currentUserId = (int)Session["UserID"];
                var currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
                conversations = db.Conversations.Where(c => (c.receiverId == currentUser.Id
                                                             && c.senderId == contact) ||
                                                            (c.receiverId == contact
                                                             && c.senderId == currentUser.Id))
                    .OrderBy(c => c.created_at)
                    .ToList();
            }

            return Json(
                new {status = "success", data = conversations},
                JsonRequestBehavior.AllowGet
            );
        }

Контекст:

public ChatContext() : base("TrinityEntities")
        {
        }

        public static ChatContext Create()
        {
            return new ChatContext();
        }

        public DbSet<tblUser> Users { get; set; }
        public DbSet<tblMessage> Conversations { get; set; }

Класс модели базы данных:

public class tblMessage
    {
        public tblMessage()
        {
            status = messageStatus.Sent;
        }

        public enum messageStatus
        {
            Sent,
            Delivered
        }

        public int Id { get; set; }
        public int senderId { get; set; }
        public int receiverId { get; set; }
        public string message { get; set; }
        public messageStatus status { get; set; }
        public System.DateTime created_at { get; set; }
    }

1 Ответ

0 голосов
/ 10 апреля 2019

Вот проблема с Table Mapping для базы данных. каждая сущность будет настроена для сопоставления с таблицей с тем же именем, что и у свойства DbSet<TEntity>, которое предоставляется производному контексту. Если для данной сущности нет DbSet<TEntity>, используется имя класса. как вы установили в своем коде Users и Conversations не является именем таблицы. для этого вы также можете настроить ссылку https://docs.microsoft.com/en-us/ef/core/modeling/relational/tables и используйте Data Annotations для указания имени таблицы.

 public messageStatus status { get; set; }

Я думаю, что это свойство не является частью вашего столбца таблицы, поэтому вы должны указать [NotMapped] Аннотации данных.

после изменений и добавления Data Annotations к контексту таблицы и к виду таблицы.

public class ChatContext : DbContext
{
    public ChatContext()
    {

    }
    public virtual DbSet<tblUser> Users { get; set; }
    public virtual DbSet<tblMessage> Conversations { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=test;Trusted_Connection=True;MultipleActiveResultSets=true");
        }
    }
}

и ваши модели (таблицы) сущности выглядят так.

[Table("tblMessage")]
public class tblMessage
{
    public tblMessage()
    {
        status = messageStatus.Sent;
    }
    public enum messageStatus
    {
        Sent,
        Delivered
    }
    public int Id { get; set; }
    public int senderId { get; set; }
    public int receiverId { get; set; }
    public string message { get; set; }
    [NotMapped]
    public messageStatus status { get; set; }
    public System.DateTime created_at { get; set; }
}

[Table("tblUser")]
public class tblUser
{
    public int id { get; set; }
    public string name { get; set; }
}

теперь вы можете получить доступ к Conversations и Users после добавления [Table("<table-name>")] аннотаций данных.

также вы можете использовать Fluent API для отображения таблицы.

после использования таблицы отображения таблиц после изображения кода отладки, например.

enter image description here

Я надеюсь, что это поможет вам, и дайте мне знать, если потребуется дополнительная информация. :)

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