插入一对多

时间:2018-04-01 10:54:50

标签: c# .net entity-framework wcf

我正在与EF6合作开展一个小项目。每当我想插入一些OneToManyManyToMany真实关系的数据时,我都会遇到错误:

  

InvalidOperationException:无法将项目添加到“Shared.ProjectStep []”类型的固定大小数组

我搜索了一下,发现了使用ICollection替换导航属性的IList以及通过Add Service Reference更改序列化的建议,但这些都没有效果。

我的实体(省略了几个字段,因为它们不应该造成问题):

[DataContract(Namespace = "Shared")]
public class Project
{

    public Project()
    {
        this.ProjectSteps = new List<ProjectStep>();
    }

    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public virtual IList<ProjectStep> ProjectSteps { get; set; }
}

[DataContract(Namespace = "Shared")]
public class ProjectStep
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public Project Project { get; set; }
}

我已通过Fluent API定义了以下关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Project>().HasMany<ProjectStep>(p => p.ProjectSteps).WithRequired(ps => ps.Project).Map(m => m.MapKey("Project"));
}

我有PMSDatabaseConnector将操作委托给我的PMSContext : DbContext

此上下文是使用

创建的
public PMSContext() : base(nameOrConnectionString: "PmsDb")
{
    this.Configuration.ProxyCreationEnabled = false;
    this.Configuration.LazyLoadingEnabled = false;
}

最后我的方法是插入ProjectStep

public void InsertProjectStep(ProjectStep ps)
{
    this.projectSteps.Add(ps);
    this.SaveChanges();
}

每当我现在执行

ProjectStep ps = new ProjectStep();
ps.Description = "test";
ps.EndDate = new DateTime();
ps.Project = service.FindProjectById(8);
ps.StartDate = new DateTime();
service.InsertProjectStep(ps);

(创建一个新的ProjectStep,设置几个字段以及与Project的连接),我得到了异常

  

InvalidOperationException:无法将项目添加到固定大小   数组'Shared.ProjectStep []'。

添加此行

this.projects.Find(ps.Project.ID).ProjectSteps.Add(ps);

作为InsertProjectStep方法中的第一行,如下所示:

public void InsertProjectStep(ProjectStep ps)
{
    this.projects.Find(ps.Project.ID).ProjectSteps.Add(ps);
    this.projectSteps.Add(ps);
    this.SaveChanges();
}

,我收到错误

  

违反了多重约束。角色   'Project_ProjectSteps_Source'的关系   'PMSDatabaseConnector.Project_ProjectSteps'具有多重性1或   0..1'。

我真的迷失在这个话题上。我尝试了所有我能找到的东西,但没有修复第一个错误。

有人可以帮我理解为什么会出现这些错误,以及如何修复它们?

1 个答案:

答案 0 :(得分:2)

虽然EF集合导航属性的一般建议是使用ICollection<T>类型,但它不适用于WCF序列化,因为它允许WCF解串器分配T[]。同样适用于IList<T>T[]&#34;实现&#34;两个接口以及许多其他接口。)

解决方案是不使用界面,但具体类型List<T>

[DataMember]
public virtual List<ProjectStep> ProjectSteps { get; set; }

另一种需要更多编码的方法是使用显式支持字段:

private ICollection<ProjectStep> projectSteps;

[DataMember]
public virtual ICollection<ProjectStep> ProjectSteps
{
    get { return projectSteps; }
    set { projectSteps = value is ProjectStep[] ? value.ToList() : value; }
}