Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections EF 5,一对多,多表_Collections_Entity Framework 5_One To Many - Fatal编程技术网

Collections EF 5,一对多,多表

Collections EF 5,一对多,多表,collections,entity-framework-5,one-to-many,Collections,Entity Framework 5,One To Many,我在以下课程中遇到了一些问题: public class TwoVariableDetails { public TwoVariableDetails() { MovementsPerBlocks = new HashSet<MovementsRow>(); MovementsPerShiftTypes = new HashSet<MovementsRow>(); MovementsPerMachin

我在以下课程中遇到了一些问题:

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; }
}
声明已终止

这是我用于保存的代码:

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类更改为具有四个模型属性和四个modelid fk,然后使用InverseProperty属性?

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

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


我会同意的。这可能是最好的解决办法。另一种选择是在
MovementRow
中根本没有
Model
属性。它正在工作,但您将无法从
MovementRow
导航到
TwoVariableDetails

您的
FK\u dbo.Movement\u dbo.TwoVariableDetails\u ModelId
被违反,简单地说,
Movement
记录使用的
ModelId
twovabledetails
中还不存在

如果您希望保持它的简单性和事务性,那么您可以与数据库上下文一起使用,首先在事务中保存
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();
}
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();
}