簡體   English   中英

實體框架為聯接表創建POCO類

[英]Entity framework create POCO class for join table

我正在嘗試在我的數據datacontextdatacontext表(為m2m關系創建的一個)創建POCO實體。

我這樣做的原因是我想自己處理插入表中的鍵。 (不要問我為什么,幾個性能問題。)

所以算法是這樣的:

  1. 我使用基於現有表的本地ADO.NET工具生成POCO類,比如說TableAnotherTable (此表將另外兩個TableAnotherTable聯接AnotherTable )。 或者只是手動創建它。

  2. 我正在嘗試為其添加遷移。 是否使用-IgnoreChanges 如果沒有-IgnoreChanges它將嘗試將現有表TableAnotherTable重命名為TableAnotherTable1 聽起來很公平,但是為什么呢? 它應該僅將現有表映射到新創建的POCO類。

  3. 我正在清理Up()Down()方法。

  4. 嘗試運行該應用程序並在上下文中執行一些CUD操作,並不斷出現錯誤:無效的對象名稱dbo.TableAnotherTable1

因此,主要問題是: 如何將實體框架創建的聯接表映射到自己的類,以便像常規實體一樣使用它?

更新

public class Client
{
  public int Id {get;set;}
  public ICollection<Group> Groups {get;set;}
}

public class Group
{
  public int Id {get;set;}
  public ICollection<Client> Clients {get;set;}
}

沒有其他配置或其他內容。

數據庫中GroupClient表的名稱為GroupClient

我正在使用ADO.NET poco生成工具檢索的poco類是:

[Table("GroupClient")]
public partial class GroupClient
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Group_Id { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Client_Id { get; set; }
}

具有自動鏈接表的初始模型應已生成GroupClient表,其中有兩列Group_IdClient_Id構成PK。

您應該能夠將其映射到具有顯示的已生成顯式GroupClient實體的模型,該實體已經定義了屬性和PK,但是您需要更改現有實體導航屬性的類型並指定FK:

public class Client
{
    public int Id { get; set; }
    [ForeignKey("Client_Id")]
    public ICollection<GroupClient> Groups { get; set; }
}

public class Group
{
    public int Id { get; set; }
    [ForeignKey("Group_Id")]
    public ICollection<GroupClient> Clients { get; set; }
}

我個人發現使用Fluent配置更容易遵循:

模型:

public class Client
{
    public int Id { get; set; }
    public ICollection<GroupClient> Groups { get; set; }
}

public class Group
{
    public int Id { get; set; }
    public ICollection<GroupClient> Clients { get; set; }
}

public class GroupClient
{
    public int Group_Id { get; set; }
    public int Client_Id { get; set; }
}

組態:

modelBuilder.Entity<GroupClient>()
    .ToTable("GroupClient")
    .HasKey(e => new { e.Group_Id, e.Client_Id });

modelBuilder.Entity<Group>()
    .HasMany(e => e.Clients)
    .WithRequired() // or (e => e.Group) in case you add nav property
    .HasForeignKey(e => e.Group_Id);

modelBuilder.Entity<Client>()
    .HasMany(e => e.Groups)
    .WithRequired() // or (e => e.Client) in case you add nav property
    .HasForeignKey(e => e.Client_Id);

暫無
暫無

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

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