簡體   English   中英

實體框架數據庫優先-不帶主鍵的表

[英]Entity Framework database-first - table without primary key

我先擁有數據庫EF,然后為Entity Framework手動創建模型類-我沒有生成任何模型。

我收到此錯誤:

未處理ModelValidationException HResult = -2146233088消息=在模型生成期間檢測到一個或多個驗證錯誤:UserToGroup EntityType'UserToGroup'沒有定義鍵。 定義此EntityType的鍵。 UserToGroup EntityType EntitySet'UserToGroup'基於未定義鍵的'UserToGroup'類型。

模型類別:

public class Group
{
   [key]
   public int ID { get; set; }
   public string Name { get; set; }
   public int ClubId { get; set; }
}

public class User
{
   [key]
   public int ID { get; set; }
   public string Name { get; set; }
   public string email { get; set; }
}

public class UserToGroup
{
   public int GroupID { get; set; }
   public int UserID { get; set; }
}

在數據庫腳本表UserToGroup

CREATE TABLE [dbo].[usertogroup] 
( 
     [groupid] [INT] NOT NULL, 
     [userid]  [INT] NOT NULL, 
     CONSTRAINT [IX_UserToGroup] 
         UNIQUE NONCLUSTERED ([groupid] ASC, [userid] ASC)
) 
ON [PRIMARY] 
GO

ALTER TABLE [dbo].[usertogroup] WITH CHECK 
    ADD CONSTRAINT [FK_UserToGroup_Group] 
        FOREIGN KEY([groupid]) REFERENCES [dbo].[group] ([id]) 
GO    

ALTER TABLE [dbo].[usertogroup] CHECK CONSTRAINT [FK_UserToGroup_Group] 
GO

ALTER TABLE [dbo].[usertogroup] WITH CHECK 
    ADD CONSTRAINT [FK_UserToGroup_User] 
        FOREIGN KEY([userid]) REFERENCES [dbo].[user] ([id]) 
GO

ALTER TABLE [dbo].[usertogroup] CHECK CONSTRAINT [FK_UserToGroup_User] 
GO

我的課堂背景:

public class myContext : DbContextBase
{
   public const string ConnectionStringName = @"xxxxxx";

   public myContext() : base(ConnectionStringName)
   { }

   public DbSet<Group> Group { get; set; }
   public DbSet<User> User { get; set; }
   public DbSet<User> UserToGroup { get; set; }

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

      base.OnModelCreating(modelBuilder);
   }
}

預先感謝您的任何幫助

EF需要一個鍵定義才能跟蹤實體,即使該表沒有PK。 如果聯接表僅包含2個FK,則您有兩種選擇。

選項1:多對多,無需加入實體。 為此,您可以映射用戶(以及用戶(可選)中的用戶)的組集合,然后設置HasMany.WithMany關系。 您告訴EF有關連接表/列的信息,然后可以在沒有連接實體的情況下訪問集合。

public class User
{
  // User columns...

  public ICollection<Group> Groups { get; set; } = new List<Group>();
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
  public UserConfiguration()
  {
    ToTable("user");
    HasKey(x => x.UserId)
      .Property(x => x.UserId)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

   HasMany(x => x/Groups)
     .WithMany() // if Group has no Users collection, otherwise .WithMany(x => x.Users)
     .Map(x => 
     {
       x.ToTable("usertogroup");
       x.MapLeftKey("userId");
       x.MapRightKey("groupId");
     });
 }
}

為用戶獲取組: user.Groups;

選項2:映射加入實體(用戶到組)。 如果聯接表具有其他列(例如,修改的跟蹤列),則需要這樣做。 在這種情況下,您需要在表上映射兩個FK組合的鍵。

public class User
{
  // User columns...

  public virtual ICollection<UserToGroup> UserGroups { get; set; } = new List<UserToGroup>();
}
public class UserToGroup
{
  public int UserId { get; set; }
  public int GroupId { get; set; }

  public virtual User User { get; set; }
  public virtual Group Group { get; set; }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
  public UserConfiguration()
  {
    ToTable("user");
    HasKey(x => x.UserId)
      .Property(x => x.UserId)
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

   HasMany(x => x.UserGroups)
     .WithRequired(x => x.User); 
}

public class UserGroupConfiguration : EntityTypeConfiguration<UserGroup>
{
  public UserGroupConfiguration()
  {
    ToTable("usertogroup");
    HasKey(x => new { x.UserId, x.GroupId });
  }
}

這告訴EF如何將用戶映射到組關聯。 有時您可能想要映射未定義PK的表。 EF需要一個Key來跟蹤實體,因此在這些情況下,您將使用相同的技術來指定所有必需的列,以使其能夠將一行與任何一行以及所有其他行區分開。 如果您創建具有一組列的鍵,則必須確保它們在表中的唯一性,否則您將得到意想不到的結果。 (例如,讀取或寫入表中的錯誤行。)

獲取用戶的組: user.UserGroups.Select(x => x.Group);

暫無
暫無

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

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