代码之家  ›  专栏  ›  技术社区  ›  BeniaminoBaggins

EF Core-在每个实体上没有关节字段的联接表

  •  0
  • BeniaminoBaggins  · 技术社区  · 5 年前

    我在我的实体上有一处财产 GroceryItem 打电话 GroceryItemGroceryStores 它的唯一目的是让Entity Framework Core知道如何创建联接表。同一联接表的另一个实体 GroceryStore 有相同的属性。我其实不希望我的两个实体拥有这个属性,因为它只会导致一个永无止境的循环 GroceryItemGroceryStore 有一个 Establishment (GroceryStore) 它有一个 杂货店杂货店 哪个有相同的 机构(杂货店) 它将永远持续下去。如何删除该属性 食品杂货店食品杂货店 从…起 杂货店 杂货店 ,但保留联接表? 具有无限深度的实体:

    enter image description here

    namespace Vepo.Domain
    {
        public class GroceryItem : AVeganItem<GroceryItemTag, GroceryStore>
        {
            [Required]
            public string Name { get; set; }
            [Required]
            public string Brand { get; set; }
            [Required]
            public string Description { get; set; }
            public string Image { get; set; }
            [NotMapped]
            public List<GroceryStore> Establishments { get; set; }
            [NotMapped]
            public virtual ICollection<GroceryItemGroceryStore> GroceryItemGroceryStores { get; set; }
    
        }
    }
    
    namespace Vepo.Domain
    {
        [Serializable]
        public abstract class AVeganItem<VeganItemTagType, EstablishmentType> : ADomainEntity<int>
        {
            [Required]
            public int IsNotVeganCount { get; set; }
            [Required]
            public int IsVeganCount { get; set; }
            [Required]
            public int RatingsCount { get; set; }
            [Required]
            public int Rating { get; set; }
            [Required]
            public List<VeganItemTagType> Tags { get; set; }
            [Required]
            public int CurrentRevisionId { get; set; }
    
        }
    }
    
    namespace Vepo.Domain
    {
        [Serializable]
        public abstract class ADomainEntity<IdType>
        {
            public IdType Id { get; set; }
    
        }
    }
    namespace Vepo.Domain
    {
        [Serializable]
        public class GroceryStore : AEstablishment<GroceryItem>
        {
            public virtual ICollection<GroceryItemGroceryStore> GroceryItemGroceryStores { get; set; }
    
        }
    }
    

    这是连接表。只需查看它的超类。正如你所看到的,它有几个额外的字段。也许这会让事情复杂化?

    namespace Vepo.Domain
    {
        [Serializable]
        public class GroceryItemGroceryStore : AVeganItemEstablishment<GroceryItem, GroceryStore>
        {
        }
    }
    namespace Vepo.Domain
    {
        [Serializable]
        public abstract class AVeganItemEstablishment<VeganItemType, EstablishmentType> : ADomainEntity<int>
        {
            [Key, Column(Order = 0), Required]
            public int VeganItemId { get; set; }
            [Key, Column(Order = 1), Required]
            public int EstablishmentId { get; set; }
    
            public virtual VeganItemType VeganItem { get; set; }
            public virtual EstablishmentType Establishment { get; set; }
    
            [Required]
            public int NotInEstablishmentCount { get; set; }
            [Required]
            public int InEstablishmentCount { get; set; }
            [Required]
            public double Price { get; set; }
    
        }
    }
    

    数据库上下文:

    modelBuilder.Entity<GroceryItemGroceryStore>()
                .HasOne(gigs => gigs.VeganItem)
                .WithMany(vi => vi.GroceryItemGroceryStores)
                .HasForeignKey(gigs => gigs.VeganItemId);
            modelBuilder.Entity<GroceryItemGroceryStore>()
                .HasOne(gigs => gigs.Establishment)
                .WithMany(e => e.GroceryItemGroceryStores)
                .HasForeignKey(gigs => gigs.EstablishmentId);
            modelBuilder.Entity<GroceryItemGroceryStore>(gigs =>
            {
                gigs.HasIndex(e => new { e.VeganItemId, e.EstablishmentId }).IsUnique();
            });
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Melvin    5 年前

    如果您使用的是Entity Framework Core 5.0,则无需显式定义联接表。EF Core将为您服务。您可以在GroceryItem实体中定义GroceryStore集合,并且GroceryItem实体可以具有GroceryStore实体集合。EF core将为您创建一个连接表。

    有关更多详细信息,请参阅链接。 https://mycodingtips.com/2021/3/16/configure-many-to-many-relationships-in-entity-framework-core-code-first

    推荐文章