代码之家  ›  专栏  ›  技术社区  ›  JC Ford

EF尝试将外键值插入主键字段

  •  0
  • JC Ford  · 技术社区  · 11 年前

    我定义了以下两个实体。A. 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);
    }
    

    当我尝试创建一个新的 响应系列 和一个新的 表t用户会话 因为它是这样的:

    responseSeries.TabletUserSession = new TabletUserSession
    {
        StartDate = DateTime.Now,
        TabletId = request.TabletId,
    };
    
    context.ResponseSeries.Add(responseSeries);
    context.SaveChanges();
    

    插入时引发错误 表t用户会话 因为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 */)
    

    我在这里束手无策。我尝试过以各种方式更改映射,但我所能做的就是让它抛出不同的异常。我没有看到什么?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Dismissile    11 年前

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

    在从属表上,主键也是相关实体的外键。

    在您的示例中:

    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是主键,是关系中的主要实体。在这种情况下,TabletUserSession实体的主键需要是ResponseSeriesId。它没有自己的身份,因为否则它不是真正的一对零或一。