EF试图将外键值插入主要密钥字段



i有以下两个实体定义。ResponseSeries可以具有相关的TabletUserSession。这是一种相当直接的一到零或一关系的关系。

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 */)

我在这里结束。我尝试以各种方式更改映射,但是我所能做的就是让它提出不同的例外。我没有看到什么?

对于存在一对一的关系。两个实体上的主要键是相同的。

在依赖表上,主要键也是相关实体的外键。

在您的示例中:

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; }
}

响应式行为是主要键,是关系中的prinicpal实体。在这种情况下,tabletusersession实体的主要关键需要是响应式响应。它没有自己的身份,因为它实际上不是一个或一个或一个。

最新更新