由于外键,无法在数据库中保存datetime2吗?

时间:2017-06-08 15:27:22

标签: c# entity-framework

在我的休息服务中,我真的很喜欢我的约会时间。我想要的就是创建一个像这样的新日期:

Date ter = new Date()
                    {
                        StartTime = dto.StartTime,
                        EndTime = dto.EndTime,
                        Name = dto.Name,
                        Place = dto.Place,
                        Datetype = tera,
                        Type = dto.Type,
                        //Squad = new Squad(),
                        TeamNumber = mannschaft.Id
                    };
                    uow.RepDate.Create(ter);
                    //mannschaft.Dates.Add(ter);
                    uow.SaveChanges();

我没有创建此日期,而是收到此错误消息:

  

保存不公开其关系的外键属性的实体时发生错误。 EntityEntries属性将返回null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅InnerException。

我的日期实体中没有设置任何外键。发生了什么?

修改

我的日期实体:

public class Date
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Place { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    //public Squad Squad { get; set; }
    public virtual Datetype Datetype { get; set; }
    [ForeignKey("Datetype")]
    public int DatetypeId { get; set; }

    public string Type { get; set; }
    public virtual ICollection<Participation> Participations { get; set; }
    public virtual Squad Squad { get; set; }
    public int TeamNumber { get; set; }
}

现在内部异常(日期实体中已更改的字段):

  

INSERT语句与FOREIGN KEY约束冲突\&#34; FK_dbo.Dates_dbo.Datetypes_DatetypeId \&#34;。冲突发生在数据库\&#34; SchoolDb \&#34;,table \&#34; dbo.Datetypes \&#34;,column&#39; DatetypeId&#39;。\ r \ n该声明已终止

Datetype:

public class Datetype
{
    [Key]
    public int DatetypeId { get; set; }
    public string Name { get; set; }
    //public virtual ICollection<Squad> Squads { get; set; }
    public int TeamId { get; set; }

}

修改 我想问题就在这里:

 Datetype tera=new Datetype();
            if (mannschaft != null)
            {
                if (!dto.DatetypeId.Equals(null)) { 
                foreach (Datetype termin in mannschaft.Datetypes)
                {
                    if (termin.DatetypeId == dto.DatetypeId)
                    {
                        tera = termin;
                    }
                }

每当我测试服务时,我都懒得为日期创建一个Datetype,因此tera是一个空的日期类型。所以外键有几个问题要找到datetype。当我创建一个日期类型时,一切正常。有没有办法让日期类型可选?

1 个答案:

答案 0 :(得分:0)

感谢您更新问题

当您将DateType实体分配给Date实体时,我们不会为您提供代码。但是,从上下文和错误中可以看出,试图保存DateType实体的上下文没有从数据库中查询Date实体。因此,它不会被上下文跟踪,当您调用SaveChanges时,它会尝试插入已存在于数据库中的实体。

以下是您的选择:

  1. 使用相同的上下文

  2. 查询DateType实体
  3. 在保存前将DateType实体附加到当前上下文

  4. 不要使用关系分配,而只是分配外键ID

  5. 最有效的选择是最后一个:

    Date ter = new Date()
    {
        StartTime = dto.StartTime,
        EndTime = dto.EndTime,
        Name = dto.Name,
        Place = dto.Place,
        //Datetype = tera,
        DatetypeId = tera.DatetypeId,
        Type = dto.Type,
        //Squad = new Squad(),
        TeamNumber = mannschaft.Id
    };
    uow.RepDate.Create(ter);
    //mannschaft.Dates.Add(ter);
    uow.SaveChanges();