0
我有以下兩個實體定義。 A ResponseSeries
可以有一個相關的TabletUserSession
。這是一個非常直接的一對一或一對一的關係。EF試圖將外鍵值插入主鍵字段
public class ResponseSeries : TrackedEntity
{
public ResponseSeries()
{
Responses = new Collection<Response>();
}
public Int32 ResponseSeriesId { get; set; }
public virtual TabletUserSession TabletUserSession { get; set; }
public virtual ICollection<Response> Responses { get; set; }
}
和
public class TabletUserSession : TrackedEntity
{
public Int32 TabletUserSessionId { get; set; }
public Int32 ResponseSeriesId { get; set; }
public Int32? TabletId { get; set; }
public DateTime StartDate { get; set; }
public DateTime? ClosedDate { get; set; }
public virtual Tablet Tablet { get; set; }
public virtual ResponseSeries ResponseSeries { get; set; }
}
我配置一樣的映射這樣:
public TabletUserSessionMap()
{
HasRequired(tus => tus.ResponseSeries).WithOptional(rs => rs.TabletUserSession);
}
當我嘗試創建一個新的ResponseSeries
和一個新TabletUserSession
像這樣:
responseSeries.TabletUserSession = new TabletUserSession
{
StartDate = DateTime.Now,
TabletId = request.TabletId,
};
context.ResponseSeries.Add(responseSeries);
context.SaveChanges();
插入TabletUserSession
時會引發錯誤,因爲EF會嘗試將ResponseSeriesId
插入TabletUserSessionId
。
INSERT [dbo].[TabletUserSession]
([TabletUserSessionId],
[ResponseSeriesId],
[TabletId],
[StartDate],
[ClosedDate],
[Version],
[CreatedUserId],
[CreatedDate],
[LastUpdateUserId],
[LastUpdateDate])
VALUES (4404 /* @0 */, -- <--This is going into the wrong field!
0 /* @1 */,
9 /* @2 */,
'2014-03-06T13:30:03' /* @3 */,
NULL,
1 /* @4 */,
'801162722' /* @5 */,
'2014-03-06T13:30:03' /* @6 */,
'801162722' /* @7 */,
'2014-03-06T13:30:03' /* @8 */)
我在這裏結束了。我嘗試過以各種方式改變映射,但我所能做的就是讓它拋出不同的例外。我沒有看到什麼?
任何方式使這項工作不改變數據模型?也許把它設置爲好像它是一對多的? –
當然,如果你將它設置爲一對多的關係,它會正常工作。 ResponseSeries將具有ICollection而不是單個項目。如果您嘗試添加第二個項目,可能會出現一些會引發異常的業務邏輯。 –
Dismissile
是的,它醜陋,但醜陋是我們在使用現有數據庫時有時必須做的事,對嗎? 我添加了TabletUserSessions集合屬性,並添加了一個忽略的TabletUserSession屬性,使我可以輕鬆訪問該集合的唯一成員。如果我真的很徹底,我可以寫一個自定義的ICollection實現,只允許一個成員,但我不是那麼透徹。 爲了新的發展,我一定會把EF的一對一慣例考慮在內。謝謝你的幫助! –