Model First アプローチで、.NET 4.0 で実行されている EF5 に関する次の問題を見つけました: 次の自動生成エンティティがあります。
Partial Public Class Notice
Private _id As Integer
Public Property id As Integer
Get
Return _id
End Get
Friend Set(ByVal value As Integer)
_id = value
End Set
End Property
Public Property order_id As Integer
Public Property employee_id As Integer
Public Property sysdate As Datetime
Public Property content As String
Public Overridable Property order As Order
Public Overridable Property employee As Employee
End Class
Notice エンティティは、Order エンティティおよび Employee エンティティと 1 (Order、Employee) 対多 (Notice) の関係で関連付けられます。
その後、Order エンティティは Employee エンティティとも関連付けられます。つまり、多数 (注文) 対 1 (従業員) の関係です。
次に、Notice エンティティと Employee エンティティの違反との関係により、次の単体テストが失敗すると予想します (notice1.employee ナビゲーション プロパティを割り当てません)。
<TestMethod()>
<ExpectedException(GetType(DbUpdateException))>
Public Sub ShouldNotAllowSaveNoticeWithoutAssignedEmployee()
Dim notice1 = CreateNewNotice() ' returned entity has not set any relation
notice1.order= CreateNewOrderWithAllRequiredAndRelatedEntities()
DbContext.noticeSet.Add(notice1)
DbContext.SaveChanges()
End Sub
しかし、結果テストは合格です。データベースでは、Notice->employee_id の値は Order->employee_id の値と同じですが、これらの外部キーが異なる Employee オブジェクトを指している可能性があるため、予期されていません。私はnotice1.employeeナビゲーションプロパティを自分で設定する必要があると予想してDbUpdateException
いました.それを忘れると例外が発生したいと思います.
この奇妙な EF5 の動作の理由は何ですか?
アップデート:
CreateNewNotice()
とCreateNewOrderWithAllRequiredAndRelatedEntities()
実装:
Protected Function CreateNewNotice(Optional ByVal suffix As Int32 = 1) As Notice
Dim notice1 = New Notice() With {
.sysdate = DateTime.Now,
.content = Description & suffix ' Description is constant, for testing purposes
}
Return notice1
End Function
Protected Function CreateNewOrderWithAllRequiredAndRelatedEntities(Optional ByVal suffix As Int32 = 1) As Order
Dim order1 = CreateNewOrder(suffix) ' returned entity has not set any relation
order1.employee = CreateNewEmployee(suffix)
order1.customer = CreateNewCustomerWithAllRequiredRelatedEntities(suffix)
order1.seller = CreateNewSeller(suffix)
For i As Integer = 1 To 3
order1.notices.Add(CreateNewNotice(i)) ' created notices have not initialized relations
Next
Return order1
End Function