【问题标题】:Navigation property has been configured with conflicting multiplicities Fluent API导航属性已配置有冲突的多重性 Fluent API
【发布时间】:2016-09-05 06:48:33
【问题描述】:

嗨!我在两个表之间有一些关系问题,一对多。

整个概念如下:
表 1:国家: 除了它自己的字段外,它还包含两个 ICollection,其中一个指向区域集合,另一个指向城市。

表 2:地区 除了它自己的字段,它还包含一个 CountryId 和一个 ICollection 的城市。

表 3:城市 除了它自己的字段外,它还包含一个 CountryId 和一个 RegionId(其中 regionId 可以为空)。

主要思想是一个国家可以有地区或/和城市。 这意味着从区域/城市到 CountryId 的每个外键都不能为空。但是,从城市到区域的外键允许为空,因为“某些”国家,在这种情况下,区域是不必要的。

请注意,所有三个表都使用 ICollection 引用了一个中间表,该中间表又存储了它们之间的关系。

国家实体:

public class Country
{
    public Guid Id { get; set; }
    public int CountryId { get; set; }
    public Guid ComponentId { get; set; }

    public string NumCode { get; set; }
    public string Code2 { get; set; }
    public string Code3 { get; set; }

    public virtual ICollection<Region> Regions { get; set; }
    public virtual ICollection<City> Cities { get; set; }
    public virtual ICollection<AdvertGeography> AdvertsGeographies { get; set; }
}

public class CountryMap()
    {
        // Primary Key
        HasKey(t => t.Id);
        Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        // Unique Index
        Property(e => e.ComponentId)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Unique_Component", 1) { IsUnique = true }));
        Property(e => e.CountryId)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Unique_Country", 1) { IsUnique = true }));

        // Properties

        // Table & Column Mappings
        ToTable("Country");

        Property(e => e.Id).HasColumnName("Id");
        Property(e => e.CountryId).HasColumnName("CountryId");
        Property(e => e.ComponentId).HasColumnName("ComponentId");
        Property(e => e.Code2).HasColumnName("Code2");
        Property(e => e.Code3).HasColumnName("Code3");
        Property(e => e.NumCode).HasColumnName("NumCode");

        // Relationships
        HasMany(t => t.Regions)
            .WithRequired(t => t.Country).WillCascadeOnDelete(false);

        HasMany(t => t.Cities)
            .WithRequired(t => t.Country).WillCascadeOnDelete(false);

    }

区域实体:

 public class Region
{
    public Region()
    {
        this.Cities = new HashSet<City>();
    }
    public Guid Id { get; set; }
    public Guid CountryId { get; set; }
    public virtual Country Country { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Office> Offices { get; set; }
    public virtual ICollection<City> Cities { get; set; }
    public virtual ICollection<OpenApplication> OpenApplications { get; set; }
    public virtual ICollection<Subscription> Subscriptions { get; set; }
    public virtual ICollection<AdvertGeography> AdvertsGeographies { get; set; }
}

public class RegionMap()
    {
        // Primary Key
        HasKey(t => t.Id);
        Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        // Unique Index
        Property(e => e.Name)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Unique", 1) { IsUnique = true }));
        Property(e => e.CountryId)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Unique", 2) { IsUnique = true }));

        // Properties
        Property(e => e.Name).IsRequired().HasMaxLength(512);

        // Table & Column Mappings
        ToTable("Region");

        Property(e => e.Id).HasColumnName("Id");
        Property(e => e.Name).HasColumnName("Name");
        Property(e => e.CountryId).HasColumnName("CountryId");

        // Relationships
        HasMany(t => t.Subscriptions)
            .WithMany(t => t.Regions);

        HasMany(t => t.OpenApplications)
            .WithMany(t => t.Regions);

        HasMany(t => t.Offices)
            .WithRequired(t => t.Region);

        HasMany(t => t.Cities)
            .WithRequired(t => t.Region);

        HasRequired(t => t.Country).WithMany(t => t.Regions).WillCascadeOnDelete(false);
    }

城市实体:

public class City
{
    public Guid Id { get; set; }
    public Guid CountryId { get; set; }
    public virtual Country Country { get; set; }
    public Guid? RegionId { get; set; }
    public virtual Region Region { get; set; }
    public string Name { get; set; }
    public virtual ICollection<AdvertGeography> AdvertsGeographies { get; set; }
}

public class CityMap()
    {
        //Primary Key
        HasKey(e => e.Id);
        Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        //Unique Index
        Property(e => e.Name)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Unique", 1) { IsUnique = true }));


        //Properties
        Property(e => e.Name).IsRequired().HasMaxLength(512);

        //Table & Column Mappings
        ToTable("City");
        Property(e => e.Id).HasColumnName("Id");
        Property(e => e.Name).HasColumnName("Name");
        Property(e => e.CountryId).HasColumnName("CountryId");
        Property(e => e.RegionId).HasColumnName("RegionId");

        // Relationships
        HasRequired(t => t.Country).WithMany(t => t.Cities).WillCascadeOnDelete(false);
        HasOptional(t => t.Region).WithMany(t => t.Cities).HasForeignKey(t => t.RegionId);
    }    
/J

有人有想法吗?很高兴得到任何帮助

最好的问候

【问题讨论】:

  • 没有实际问题?

标签: c# asp.net-mvc entity-framework ef-fluent-api


【解决方案1】:

其实我现在已经解决了。我在 RegionMap 中错过了这个:

相当琐碎,但是当您盯着代码看太久时,这些东西很容易漏掉。

HasMany(t => t.Cities) .WithRequired(t => t.Region);

应该是

HasMany(t => t.Cities) .WithOptional(t => t.Region);

还是谢谢。

/J

【讨论】:

  • 你的问题是我的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多