2011-05-14 69 views
1

實體框架POCO模板,我得到以下結構 enter image description here爲分層表

層次結構表正如你所看到的,ParentGroupUserID指的是同一個表。現在,當我使用EF POCO t4模板爲它生成類時,它會出現以下結構。

public partial class GroupUser 
{ 
    #region Primitive Properties 

    public virtual int GroupUserID 
    { 
     get; 
     set; 
    } 

    public virtual int GroupID 
    { 
     get; 
     set; 
    } 

    public virtual string UserName 
    { 
     get; 
     set; 
    } 

    #endregion 
    #region Navigation Properties 

    public virtual ICollection<GroupUser> GroupUser1 
    { 
     get 
     { 
      if (_groupUser1 == null) 
      { 
       var newCollection = new FixupCollection<GroupUser>(); 
       newCollection.CollectionChanged += FixupGroupUser1; 
       _groupUser1 = newCollection; 
      } 
      return _groupUser1; 
     } 
     set 
     { 
      if (!ReferenceEquals(_groupUser1, value)) 
      { 
       var previousValue = _groupUser1 as FixupCollection<GroupUser>; 
       if (previousValue != null) 
       { 
        previousValue.CollectionChanged -= FixupGroupUser1; 
       } 
       _groupUser1 = value; 
       var newValue = value as FixupCollection<GroupUser>; 
       if (newValue != null) 
       { 
        newValue.CollectionChanged += FixupGroupUser1; 
       } 
      } 
     } 
    } 
    private ICollection<GroupUser> _groupUser1; 

    public virtual GroupUser GroupUser2 
    { 
     get { return _groupUser2; } 
     set 
     { 
      if (!ReferenceEquals(_groupUser2, value)) 
      { 
       var previousValue = _groupUser2; 
       _groupUser2 = value; 
       FixupGroupUser2(previousValue); 
      } 
     } 
    } 
    private GroupUser _groupUser2; 

    public virtual ICollection<Franchise> Franchises 
    { 
     get 
     { 
      if (_franchises == null) 
      { 
       var newCollection = new FixupCollection<Franchise>(); 
       newCollection.CollectionChanged += FixupFranchises; 
       _franchises = newCollection; 
      } 
      return _franchises; 
     } 
     set 
     { 
      if (!ReferenceEquals(_franchises, value)) 
      { 
       var previousValue = _franchises as FixupCollection<Franchise>; 
       if (previousValue != null) 
       { 
        previousValue.CollectionChanged -= FixupFranchises; 
       } 
       _franchises = value; 
       var newValue = value as FixupCollection<Franchise>; 
       if (newValue != null) 
       { 
        newValue.CollectionChanged += FixupFranchises; 
       } 
      } 
     } 
    } 
    private ICollection<Franchise> _franchises; 

    #endregion 
    #region Association Fixup 

    private void FixupGroupUser2(GroupUser previousValue) 
    { 
     if (previousValue != null && previousValue.GroupUser1.Contains(this)) 
     { 
      previousValue.GroupUser1.Remove(this); 
     } 

     if (GroupUser2 != null) 
     { 
      if (!GroupUser2.GroupUser1.Contains(this)) 
      { 
       GroupUser2.GroupUser1.Add(this); 
      } 
     } 
    } 

    private void FixupGroupUser1(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (GroupUser item in e.NewItems) 
      { 
       item.GroupUser2 = this; 
      } 
     } 

     if (e.OldItems != null) 
     { 
      foreach (GroupUser item in e.OldItems) 
      { 
       if (ReferenceEquals(item.GroupUser2, this)) 
       { 
        item.GroupUser2 = null; 
       } 
      } 
     } 
    } 

    private void FixupFranchises(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (Franchise item in e.NewItems) 
      { 
       if (!item.GroupUsers.Contains(this)) 
       { 
        item.GroupUsers.Add(this); 
       } 
      } 
     } 

     if (e.OldItems != null) 
     { 
      foreach (Franchise item in e.OldItems) 
      { 
       if (item.GroupUsers.Contains(this)) 
       { 
        item.GroupUsers.Remove(this); 
       } 
      } 
     } 
    } 

    #endregion 
} 

如果你在上面的代碼中看到的,我不喜歡我的命名公共屬性GroupUser1(這是一個集合)和GroupUser2(單個對象)的概念。任何人都可以幫助我理解這種命名模式與POCO世代,有沒有一種方法我可以重命名它(無需修改t4模板)。

回答

1

這不是POCO世代的命名模式。這些名稱在您的實體模型中。更改實體模型(EDMX文件 - 設計器)中的名稱,它們也將在生成的代碼中更改。

+0

太棒了。我沒有這樣想。你真的睡拉迪斯拉夫嗎?對於任何EF問題,我通常會得到即時答案(甚至可以提供)。感謝您的回答 – DotNetInfo 2011-05-14 11:36:50

1

我不認爲EF t4 POCO模板的設計是爲了處理這種情況。手動編輯文件並不是一個好主意,因爲下次生成POCO時將會失去更改。因此,您不得不修改模板。但這並沒有那麼糟糕,因爲如果表格和字段與上面給出的匹配,那麼您可以修改模板,使其僅具有不同的輸出。例如,在我的T4模板我加入這個

bool isRequired = !edmProperty.Nullable; 
if (isRequired && entity.Name == "Adjustment" && propertyName == "AdjustmentNumber") 
{ 
    isRequired = false; 
} 

if (!isRequired && entity.Name == "Order" && propertyName == "RequiredDate") 
{ 
    isRequired = true; 
} 

<# if (isRequired) { #> [Required] 
<# } #> 

這個修改允許我到[必需]標誌添加到在數據庫NOT NULL列各個領域,除了兩個提到的字段(未設置爲必填項,因爲UI不允許您輸入這些字段)。

對於某些與標準不同的領域,它很容易具有特定的規則。

+0

我會投票你的答案,但在這種特殊情況下,拉迪斯拉夫提供的答案是完美的。無論如何,如何編輯模板文件的好解釋。 – DotNetInfo 2011-05-14 11:37:41