Entity Framework 一個表多個外鍵關聯另外一張表的相同主鍵


一. 報錯

異常:System.Data.Entity.Infrastructure.DbUpdateException: 更新條目時出錯。有關詳細信息,請參閱內部異常。 ---> System.Data.Entity.Core.UpdateException: 更新條目時出錯。有關詳細信息,請參閱內部異常。 ---> MySql.Data.MySqlClient.MySqlException: Unknown column 'o_sawEntity_SawId' in 'field list'

二. 分析

clipboard

在輸出的日志中,可以看到竟然生成三個不存在的列

clipboard

三. 解決方案

1. T4模板修改, 外鍵屬性加上特性 [ForeignKey(“”)]

改造NavigationProperty方法

為了避免從屬性上看,不知道是哪個外鍵的關聯,統一都加上了外鍵列的名稱(非常的丑陋,但是好用T^T)

  1     public string NavigationProperty(NavigationProperty navProp)
  2     {
  3         var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()) + "Entity";
  4         return string.Format(
  5             CultureInfo.InvariantCulture,
  6             @"{5}
 7             {0} {1} {2} {{ {3}get; {4}set; }}
 8 ",
  9             AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
 10             navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
 11             _code.Escape(navProp) + "_" + ((System.Data.Entity.Core.Metadata.Edm.AssociationType)navProp.RelationshipType).ReferentialConstraints[0].ToProperties[0].Name,
 12             _code.SpaceAfter(Accessibility.ForGetter(navProp)),
 13             _code.SpaceAfter(Accessibility.ForSetter(navProp)),
 14             navProp.ToEndMember.RelationshipMultiplicity != RelationshipMultiplicity.Many
 15                 ? "[ForeignKey(\""+((System.Data.Entity.Core.Metadata.Edm.AssociationType)navProp.RelationshipType).ReferentialConstraints[0].ToProperties[0].Name+"\")]" // 確保主子表、父子關系插入時報錯的問題
 16                 : ""
 17             );
 18     }

2. T4模板修改, 在列表屬性上特性 [InverseProperty("")]

  1     var navigationProperties = typeMapper.GetNavigationProperties(entity);
  2     if (navigationProperties.Any())
  3     {
  4 #>
  5 
  6 <#
  7         foreach (var navigationProperty in navigationProperties)
  8         {
  9             if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
 10             {
 11                   // 多個外鍵指向同一個表
 12                   var inverseProperty = allNavigationProperties
 13                                 .FirstOrDefault(a => a.RelationshipType.Name == navigationProperty.RelationshipType.Name
 14                                                   && a.Name != navigationProperty.Name);
 15                   if(inverseProperty != null){
 16                         var foreignKeyName= ((System.Data.Entity.Core.Metadata.Edm.AssociationType)navigationProperty.RelationshipType)
 17                                 .ReferentialConstraints[0].ToProperties[0].Name;
 18 #>
 19 
 20                 [InverseProperty("<#=inverseProperty.Name + "_" + foreignKeyName#>")]
 21 <#
 22                   }
 23 #>
 24                 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
 25 <#
 26             }
 27 #>
 28     <#=codeStringGenerator.NavigationProperty(navigationProperty)#>
 29 <#
 30         }
 31     }
 32 #>

3. 最終效果

clipboard

4. 編碼

clipboard

在列表屬性中加上entity,並標識為Added


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM