簡體   English   中英

表拆分實體框架代碼優先-3個以上實體

[英]Table Splitting Entity Framework Code First - 3+ Entities

我在程序員中發布了一個問題: https : //softwareengineering.stackexchange.com/questions/315857/entity-framework-code-first-c-class-separation-and-eav

解決該問題的一種方法是在實體框架中進行表拆分。 到目前為止,我已經看到了如何使用2個實體執行此操作,但沒有使用3個或更多實體執行此操作。

以下是我要與之共享同一表的模型:

[Table("Tournament")]
    public partial class PGTournament : IImageable
    {

        public int Id { get; set; }
        public string Name { get; set; }
        public GameGenre GameGenre { get; set; }
        public TournamentFormat TournamentFormat { get; set; }

        public TournamentStatus Status { get; set; } 
        public string Description { get; set; }
        public virtual List<PrizePool> Prizes { get; set; }

        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public virtual List<Participants.Participant> Participants { get; set; }
        public decimal Cost { get; set; }
        public string Streaming { get; set; }
        public int? ChallongeTournamentId { get; set; }
        public string Bracket { get; set; }
        public virtual List<TournamentMatch> Matches { get; set; }
        public int MainImageId { get; set; }
        public virtual Media MainImage { get; set; }
        public bool IsFollowUp { get; set; }
        public int? FollowUpTournamentId { get; set; }
        [ForeignKey("FollowUpTournamentId")]
        public virtual PGTournament FollowUptournament { get; set; }
        public int MediaID { get; set; }
        public int MainImageID { get; set; }

        //Properties that share same table:
        public virtual TournamentOrganizer Organizer { get; set; } //Change to Organizer
        public virtual TournamentOrganizerSetting OrganizerSetting { get; set; }
        public virtual TournamentSettings TournamentSettings { get; set; }
        public virtual TournamentRules Rules { get; set; }


    }

您看到的所有虛擬屬性均不具有List <>作為其類型,我希望它們共享同一張表(如果可能)。

[Table("Tournament")]
    public partial class TournamentOrganizer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string UserId { get; set; }
        [ForeignKey("UserId")]
        public AppUser User { get; set; }

        public int LogoId { get; set; }
        [ForeignKey("LogoId")]
        public Media Logo { get; set; }
        public virtual TournamentOrganizerSetting Settings { get; set; }
        public virtual TournamentRules Rules { get; set; }
        public virtual TournamentSettings TournamentSettings { get; set; }
        public virtual PGTournament Tournament { get; set; }


    }

[Table("Tournament")]
    public partial class TournamentSettings
    {
        public int Id { get; set; }
        public string Address { get; set; }
        public string LocationGoogleMaps { get; set; }
        public bool isOnline { get; set; }
        public int MaxPlayers { get; set; }
        public List<TournamentAssistant> TournamentAssistants { get; set; }

        public virtual TournamentOrganizer Organizer { get; set; } //Change to Organizer
        public virtual TournamentRules Rules { get; set; }
        public virtual TournamentOrganizerSetting OrganizerSettings { get; set; }
        public virtual PGTournament Tournament { get; set; }

    }

 [Table("Tournament")]
    public partial class TournamentOrganizerSetting
    {
        public int Id { get; set; }
        public string Location { get; set; }
        //Properties that share same table:
        public virtual TournamentOrganizer Organizer { get; set; } //Change to Organizer
        public virtual TournamentRules Rules { get; set; }
        public virtual TournamentSettings TournamentSettings { get; set; }
        public virtual PGTournament Tournament { get; set; }
    }

 [Table("Tournament")]
    public partial class TournamentRules
    {
        public int Id { get; set; }
        public string Bans { get; set; }
        public string Allowed { get; set; }
        public string Description { get; set; }
        public string FileName { get; set; }
        public string FilePath { get; set; }

        //Properties that share same table:
        public virtual TournamentOrganizer Organizer { get; set; } //Change to Organizer
        public virtual TournamentOrganizerSetting OrganizerSetting { get; set; }
        public virtual TournamentSettings TournamentSettings { get; set; }
        public virtual PGTournament Tournament { get; set; }
    }

我不知道為什么課程是局部的。 我一直在關注Internet上的一些教程,例如: http : //www.c-sharpcorner.com/UploadFile/ff2f08/table-splitting-in-entity-framework-6-code-first-approach/

我不能讓他們工作。

我什至在DbModelBuilder中嘗試過:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {    
            modelBuilder.Entity<PGTournament>().ToTable("Tournament");


            modelBuilder.Entity<PGTournament>()
                .HasKey(e => e.Id)
                .HasOptional(e => e.FollowUptournament)
                .WithMany();

            modelBuilder.Entity<PGTournament>()
                .HasKey(e => e.Id)
                .HasRequired(e => e.Organizer)
                .WithRequiredDependent(e => e.Organizer)

            modelBuilder.Entity<TournamentOrganizer>()
                .HasKey(e => e.Id)
                .HasRequired(e => e.Settings)
                .WithRequiredDependent(e => e.Organizer);

            modelBuilder.Entity<TournamentViewModel>()
                .HasKey(e => e.Id)
                .HasRequired(e => e.Settings)
                .WithRequiredDependent(e => e.Organizer);


            modelBuilder.Entity<TournamentOrganizer>().Map(m => m.ToTable("Tournament"));
            modelBuilder.Entity<TournamentOrganizerSetting>().Map(m => m.ToTable("Tournament"));

            base.OnModelCreating(modelBuilder);

        }

似乎沒有關於3個或更多實體映射的StackOverflow帖子。

當我嘗試運行它時,這是我得到的錯誤:

One or more validation errors were detected during model generation:

Pro_Gaming.Infrastructure.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
Pro_Gaming.Infrastructure.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

此答案來自ASP.NET論壇的Cole Wu: http : //forums.asp.net/p/2093110/6043922.aspx?p=True&t=635968548324560382

答案如下:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Do not delete this:
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Tournament>()
                .HasKey(e => e.TournamentId)
                .HasRequired(e => e.Rules)
                .WithRequiredPrincipal();

            modelBuilder.Entity<Tournament>()
                .HasKey(e => e.TournamentId)
                .HasRequired(e => e.TournamentSettings)
                .WithRequiredDependent();

            modelBuilder.Entity<TournamentOrganizer>()
                .HasKey(e => e.Id)
                .HasRequired(e => e.Settings)
                .WithRequiredDependent();


            modelBuilder.Entity<Tournament>().ToTable("Tournament");
            modelBuilder.Entity<TournamentRules>().ToTable("Tournament");
            modelBuilder.Entity<TournamentSettings>().ToTable("Tournament");

            modelBuilder.Entity<TournamentOrganizer>().ToTable("TournamentOrganizer");
            modelBuilder.Entity<TournamentOrganizerSetting>().ToTable("TournamentOrganizer");



        }

解釋一下:

  1. 不需要局部類(我之所以這樣說是因為有一個示例說明您需要局部類,但事實並非如此):
  2. 我還沒有測試過,但是對於要共享同一張表的所有類,我都使用了相同的鍵。
  3. modelBuilder.Entity <= TheEntity將是您希望所有內容都映射到的主類。
  4. 如果您使用的是ASP.NET Identity,並且是從IdentityDbContext擴展的(這是我的情況),則在OnModelCreating方法中包括base.OnModelCreating(modelBuilder)是非常重要的,否則,Identityissues會給您一個打擊,找不到IdenittyUser的主鍵。

    1. 然后,您將使用:

    modelBuilder.Entity.ToTable(“ MyTable”)modelBuilder.Entity.ToTable(“ MyTable”)modelBuilder.Entity.ToTable(“ MyTable”)

這會將Entity1,Entity2,Entity3等映射到MyTable。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM