2014-03-06 48 views
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 */) 

我在這裏結束了。我嘗試過以各種方式改變映射,但我所能做的就是讓它拋出不同的例外。我沒有看到什麼?

回答

0

要存在一對一的關係。主鍵在兩個實體上都是相同的。

在從屬表上,主鍵也是相關實體的外鍵。

在您的例子:

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 
{ 
    // this should not exist 
    public Int32 TabletUserSessionId { get; set; } 

    // this should be the primary key of this entity 
    // it is also the foreign key to the ResponseSeriesId 
    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; } 
} 

ResponseSeriesId是主鍵,在關係prinicpal實體。在這種情況下,TabletUserSession實體的主鍵需要是ResponseSeriesId。它沒有自己的身份,因爲否則它不是一個零或一個。

+0

任何方式使這項工作不改變數據模型?也許把它設置爲好像它是一對多的? –

+0

當然,如果你將它設置爲一對多的關係,它會正常工作。 ResponseSeries將具有ICollection 而不是單個項目。如果您嘗試添加第二個項目,可能會出現一些會引發異常的業務邏輯。 – Dismissile

+0

是的,它醜陋,但醜陋是我們在使用現有數據庫時有時必須做的事,對嗎? 我添加了TabletUserSessions集合屬性,並添加了一個忽略的TabletUserSession屬性,使我可以輕鬆訪問該集合的唯一成員。如果我真的很徹底,我可以寫一個自定義的ICollection實現,只允許一個成員,但我不是那麼透徹。 爲了新的發展,我一定會把EF的一對一慣例考慮在內。謝謝你的幫助! –