Что может быть решением для ошибки «Тип сущности не имеет определенного ключа», кроме добавления [Ключа] или именования переменной как ID или EntityNameId? - PullRequest
0 голосов
/ 30 декабря 2018

Я получаю сообщение об ошибке

Типу сущности не определен ключ

при попытке создать эшафот.Я испробовал все решения, включая добавление [Key] и присвоение имени переменной ID или EntityNameID.Однако ни одно решение не сработало для меня.

Это то, что я сделал до сих пор:

Movie класс:

namespace MvcMovie.Models
{
    public class Movie
    {
       [Key]
       public int MovieId { get; set; }
       public String Name { get; set; }
       public DateTime publishDate { get; set; }

       public virtual ICollection<Play> Plays { get; set; }
    }
}

Actor класс:

namespace MvcMovie.Models
{
   public class Actor
   {
       public int ActorId { get; set; }

       public String First_Name { get; set; }
       public String Last_Name { get; set; }
       public DateTime Date_Of_Birth { get; set; }

       public virtual ICollection<Play> Plays { get; set; }
    }
}

Play класс:

namespace MvcMovie.Models
{
   public class Play
   {
       public int PlayID { get; set; }
       public int ActorID { get; set; }
       public int MovieID { get; set; }
       public int Pay { get; set; }

       public virtual Movie Movie { get; set; }
       public virtual Actor Actor { get; set; }
   }
}   

DbContext:

namespace MvcMovie.DAL_Data_Access_Layer_
{
   public class MovieContext: DbContext
   {
       public MovieContext() : base("MovieContext")
       {
           this.Configuration.LazyLoadingEnabled = false;
       }

       public DbSet<Models.Actor> Actors { get; set; }
       public DbSet<Models.Play> Plays { get; set; }
       public DbSet<Models.Movie> Movies { get; set; }

       //protected override void OnModelCreating(DbModelBuilder modelBuilder)
       //{
       //    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
       //}
    }
} 

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы знаете, что нет проблем с вашими моделями, и связь между ними правильная, но вы сказали в комментарии, что нет созданных БД и таблиц, верно?если да, то вы должны узнать о миграции из Здесь

в любом случае, если вы хотите знать, что script будет создано вашей моделью, попробуйте выполнить код миграции ниже:

public class Configuration<T> : DbMigrationsConfiguration<T> where T : DbContext
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
}
public class DbMigrations
{
    public static void UpdateDatabaseSchema<T>(string SQLScriptPath = "C:\\script.sql") where T : DbContext
    {
        var configuration = new Configuration<T>();
        var dbMigrator = new DbMigrator(configuration);
        SaveToFile(SQLScriptPath, dbMigrator);
        dbMigrator.Update();
    }

    private static void SaveToFile(string SQLScriptPath, DbMigrator dbMigrator)
    {
        if (string.IsNullOrWhiteSpace(SQLScriptPath)) return; 
        var scriptor = new MigratorScriptingDecorator(dbMigrator);
        var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);
        File.WriteAllText(SQLScriptPath, script);
        Console.WriteLine(script);
    }
}

, выполнив эту миграцию в application start, например:

static void Main(string[] args)
{
    DbMigrations.UpdateDatabaseSchema<Models>();
}

, вы увидите, что сгенерированный метод script in SaveToFile, расположенный в C:\\script.sql, выглядит следующим образом:

CREATE TABLE [dbo].[Actors] (
    [ActorId] [int] NOT NULL IDENTITY,
    [First_Name] [nvarchar](max),
    [Last_Name] [nvarchar](max),
    [Date_Of_Birth] [datetime] NOT NULL,
    CONSTRAINT [PK_dbo.Actors] PRIMARY KEY ([ActorId])
)
CREATE TABLE [dbo].[Plays] (
    [PlayID] [int] NOT NULL IDENTITY,
    [ActorID] [int] NOT NULL,
    [MovieID] [int] NOT NULL,
    [Pay] [int] NOT NULL,
    CONSTRAINT [PK_dbo.Plays] PRIMARY KEY ([PlayID])
)
CREATE TABLE [dbo].[Movies] (
    [MovieId] [int] NOT NULL IDENTITY,
    [Name] [nvarchar](max),
    [publishDate] [datetime] NOT NULL,
    CONSTRAINT [PK_dbo.Movies] PRIMARY KEY ([MovieId])
)
CREATE INDEX [IX_ActorID] ON [dbo].[Plays]([ActorID])
CREATE INDEX [IX_MovieID] ON [dbo].[Plays]([MovieID])
ALTER TABLE [dbo].[Plays] ADD CONSTRAINT [FK_dbo.Plays_dbo.Actors_ActorID] FOREIGN KEY ([ActorID]) REFERENCES [dbo].[Actors] ([ActorId]) ON DELETE CASCADE
ALTER TABLE [dbo].[Plays] ADD CONSTRAINT [FK_dbo.Plays_dbo.Movies_MovieID] FOREIGN KEY ([MovieID]) REFERENCES [dbo].[Movies] ([MovieId]) ON DELETE CASCADE

проблем нет, протестировав приведенный ниже код:

Models model = new Models();
var actor = new Actor
{
    Date_Of_Birth = DateTime.Now,
    First_Name = "first name",
    Last_Name = "last name"
}; 
var movie = new Movie
{
    publishDate = DateTime.Now,
    Name = "movieN"
};
model.Movies.Add(movie);
model.SaveChanges();

//adding new relation 
var foundAct = model.Actors.SingleOrDefault(x => x.ActorId == 1);
foundAct.Plays.Add(new Play
{
    ActorID = foundAct.ActorId,
    MovieID = 2// MovieId from Db
}); 
model.SaveChanges(); 

Убедитесь, что ваши миграции работают и таблицы находятся в БД, или выполните этот скрипт в вашей базе данных, если вы не хотите выполнять миграцию.

0 голосов
/ 30 декабря 2018

Вы должны определить открытый ключ для каждой сущности с именем id.Кроме того, вам нужно определить внешний ключ для других лиц.

 [ForeignKey("Movie")]
 public int id { get; set; }

(например, внутри класса Play).

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