2017-09-15 61 views
0

我遇到的模型類映射覆雜類型的問題錯誤使用的EntityFramework 6.EF6代碼優先/流利的API拋出與複雜類型

(稱爲Assignment)我有以下Assignment模型類(僅限相關構件被示出):

public class Assignment 
{ 
    private AssignmentDueByInfo _dueIn; 

    public Assignment() { 
     _dueIn = new AssignmentDueByInfo(this) 
    } 

    public virtual AssignmentSettingInfo DueIn 
    { 
     get { return _dueIn; } 
     protected set { _dueIn = value; } 
    } 
} 

其中AssignmentSettingInfo被定義爲:框架6

public class AssignmentSettingInfo 
{ 
     protected AssignmentSettingInfo(Assignment assignment) 
     { 
      Assignment = assignment; 
     } 

     protected readonly Assignment Assignment; 

     public virtual int? LessonId { get; protected set; } 
     public virtual Lesson Lesson { get; protected set; } 
} 

在實體,我哈已經在數據庫中的以下CodeFirst /流利的API爲Assignment類表映射:

Property(t => t.DueIn.LessonId).HasColumnName("DueByLessonId"); 

HasOptional(x => x.DueIn.Lesson) 
      .WithMany(x => x.AssignmentsDue) 
      .HasForeignKey(x => x.DueIn.LessonId) 
      .WillCascadeOnDelete(true); 

的映射拋出以下錯誤:

The expression 'x => x.DueIn.Lesson' is not a valid property expression. The expression should represent a property: C#: 't => t.MyProperty'

爲什麼會出現這種情況,它應該如何固定?

+0

我想這是EF限制 - 複雜類型不能包含導航屬性。 –

回答

0

退房的文檔(這是很老,但仍然適用):

https://msdn.microsoft.com/en-us/library/bb738472(v=vs.100).aspx

這說明覆雜的類型不能包含導航屬性。

我想這與他們沒有主鍵的事實有關,他們不是由上下文單獨管理。如果他們沒有PK並且不能被上下文識別,他們也不能成爲「關係結束」。

0

您正試圖使SQL面向對象。您定義的代表數據庫表的類應該是POCOs:相當簡單的只有get和set屬性的類。

你對領域太過分了。如果您必須填寫其中一個表類中的字段,請再考慮一次。我從來沒有見過一個例子,代表數據庫表的類需要任何字段,而不是簡單的get/set屬性。

如果其中一個類涉及另一個類,這是由外鍵完成的,而不是由this完成。

Assignment表示數據庫表。這個表應該與其他表使用外鍵具有某些列和關係。類別Assignment不應包含不屬於表格的智能事物。

例如我看到Assignment有一個名爲_dueIn的字段AssignmentDueByInfo。局外人可以進入這個領域,但對他們來說這個領域不是AssignmentDueByInfo,而是AssignmentSettingInfo

自己決定Assignment應具有哪些列。

是否有理由將AssignmentSettingInfo的列置於不同的表中?如果我看看你的代碼,那麼在沒有'Assignment and there can't be an Assignment without an AssignmentSettingInfo`的情況下不能有AssignmentSettingInfo。那麼爲什麼把它們放在不同的表格中

另一個問題是AssignmentSettingInfoLesson之間的關係。這是一個零或一對一的? Follow these guide lines

如果你把「分配and AssignmentSettingInfo`在一個表中的代碼會像

class Assignment 
{ 
    public int Id {get; set;} 

    // every assignment has exactly one AssignmentSettingInfo 
    // use aggregation (in entity framework terms: complextype) 
    public AssignmentSettingInfo AssignmentSettingInfo {get; set;} 
} 

[ComplexType] 
class AssignmentSettingInfo 
{ 
    // Every AssignmentSettingInfo has zero or one Lesson 
    public virtual Lesson Lesson { get; set; } 
} 

類課程 { 公衆詮釋標識{獲得;設置;}

// relation between Line and AssignmentSettingInfo 
    ... 
} 

我無法弄清楚LineAssignmentSettingInfo之間的關係。訪問:

如果你真的想AssignmentSettingInfo在不同的表,其配置爲一到一個方法,如圖中的鏈接

+0

分離AssignmentSettingInfo的原因是該類的功能比所示更多,並且在其他地方重複使用。我贊成合成而不是繼承。很多已經從上面所示的類中剝離出來了;這些領域是有原因的,但不在問題範圍之內。 – Graham