0

我在以下课程中遇到了一些麻烦:

public class TwoVariableDetails
{
    public TwoVariableDetails()
    {    
        MovementsPerBlocks = new HashSet<MovementsRow>();
        MovementsPerShiftTypes = new HashSet<MovementsRow>();
        MovementsPerMachines = new HashSet<MovementsRow>();
        MovementsPerShifts = new HashSet<MovementsRow>();
    }

    [Key]
    public Guid TwoVariableDetailsId { get; set; }

    [Required]
    [MaxLength(50)]
    public string Name { get; set; }

    [Required]
    [MaxLength(1000)]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }        

    public virtual ICollection<MovementsRow> MovementsPerBlocks { get; set; }
    public virtual ICollection<MovementsRow> MovementsPerShiftTypes { get; set; }
    public virtual ICollection<MovementsRow> MovementsPerMachines { get; set; }
    public virtual ICollection<MovementsRow> MovementsPerShifts { get; set; }      

}

[Table("Movement")]
public class MovementsRow
{
    public MovementsRow()
    {
        MovementsCells = new HashSet<MovementsCell>();
    }
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [CsvField(Ignore = true)]
    public Guid MovementId { get; set; }

    [Required]
    public int RowNo { get; set; }

    [Required]
    [CsvField(Ignore = true)]
    public Guid ModelId { get; set; }

    [ForeignKey("ModelId")]
    [CsvField(Ignore = true)]
    public virtual TwoVariableDetails Model { get; set; }

    [TypeConverter(typeof(MovementsCellTypeConverter))]
    public virtual ICollection<MovementsCell> MovementsCells { get; set; }

}

[Table("MovementCell")]
public class MovementsCell
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [CsvField(Ignore = true)]
    public Guid CellId { get; set; }

    [Required]
    public int ColumnNo { get; set; }

    [Required]
    public int Count { get; set; }

    [Required]
    [CsvField(Ignore = true)]
    public Guid MovementId { get; set; }

    [ForeignKey("MovementId")]
    [CsvField(Ignore = true)]
    public virtual MovementsRow Model { get; set; }
}

当我尝试将其保存到数据库时,出现以下错误:

    The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Movement_dbo.TwoVariableDetails_ModelId". The conflict occurred in database "aspnet-GreenCranes.UI-20130516", table "dbo.TwoVariableDetails", column 'TwoVariableDetailsId'.

该语句已终止。

这是我用来保存的代码:

twoVariableDetails.TwoVariableDetailsId = Guid.NewGuid();
_context.TwoVariableDetailsModels.Add(twoVariableDetails);
_context.SaveChanges();

我的表如下所示:

Movement
    - Column    
        - MovementId
        - RowNo
        - ModelId(FK, uniqueidentifier, not null)
        - TwoVariableDetails_TwoVariableDetailsId(FK, uniqueidentifier, null)
        - TwoVariableDetails_TwoVariableDetailsId2(FK, uniqueidentifier, null)
        - TwoVariableDetails_TwoVariableDetailsId3(FK, uniqueidentifier, null)
        - TwoVariableDetails_TwoVariableDetailsId4(FK, uniqueidentifier, null)
    - Keys
        - FK_dbo.Movement_dbo.TwoVariableDetails_ModelId
        - FK_dbo.Movement_dbo.TwoVariableDetails_TwoVariableDetails_TwoVariableDetailsId
        - FK_dbo.Movement_dbo.TwoVariableDetails_TwoVariableDetails_TwoVariableDetailsId1
        - FK_dbo.Movement_dbo.TwoVariableDetails_TwoVariableDetails_TwoVariableDetailsId2
        - FK_dbo.Movement_dbo.TwoVariableDetails_TwoVariableDetails_TwoVariableDetailsId3

我不确定我的方法有什么问题。我是否应该将 MovementsRow 类更改为具有四个 Model 属性和四个 modelid fk,然后使用 InverseProperty 属性?

4

2 回答 2

0

MovementsRow.Model属于不同于 中的四个集合的另一个关系TwoVariableDetails。这就是为什么您在数据库表中没有四个,而是五个外键的原因。当您插入twoVariableDetails数据库并MovementRow在其中一个集合中包含一个实例时,EF 希望将其ModelId设置为引用现有TwoVariableDetails行的 Guid - 它显然没有。因此例外。

我是否应该将 MovementsRow 类更改为具有四个 Model 属性和四个 modelid fk,然后使用 InverseProperty 属性?

我会说是的。这可能是最好的解决方案。另一种方法是在 中完全没有Model财产MovementRow。它正在工作,但您将无法从那时开始MovementRow导航TwoVariableDetails

于 2013-05-22T17:16:53.813 回答
0

FK_dbo.Movement_dbo.TwoVariableDetails_ModelId简而言之,您正在被侵犯 - 记录使用ModelIdMovement记录尚不存在于TwoVariableDetails.

如果您想让它保持简单和事务性,那么您可以TransactionScope与您的数据库上下文一起使用,将第一个保存TwoVariableDetails在事务中,然后将与之相关的记录保存:

using (var context = new MyDbContext())
using (var tranScope = new TransactionScope(TransactionScopeOption.Required) {
  // don't save the Movement records yet
  twoVariableDetails.TwoVariableDetailsId = Guid.NewGuid();
  _context.TwoVariableDetailsModels.Add(twoVariableDetails);
  _context.SaveChanges();

 // now create the movement records, add them to twoVariableDetails
  ...
  _context.SaveChanges();

 // commit the transaction
 scope.Complete();
}
于 2013-05-22T17:18:24.093 回答