c# - 插入一对多时出现 "Fixed size array"错误

标签 c# .net entity-framework wcf

我正在使用 EF6 开发一个小项目。每当我想插入一些具有 OneToManyManyToMany 关系的数据时,我都会遇到错误:

InvalidOperationException: An item cannot be added to a fixed size Array of type '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 将操作委托(delegate)给我的 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: An item cannot be added to a fixed size Array of type '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();
}

,我得到了错误

'Multiplicity constraint violated. The role 'Project_ProjectSteps_Source' of the relationship 'PMSDatabaseConnector.Project_ProjectSteps' has multiplicity 1 or 0..1.'

我真的迷失在这个话题上。我尝试了我能找到的一切,但没有解决第一个错误。

谁能帮我理解为什么会出现这些错误,以及如何解决这些错误?

最佳答案

虽然 EF 集合导航属性的一般建议是使用 ICollection<T>类型,它不适用于 WCF 序列化,因为它允许 WCF 反序列化程序分配 T[] .同样适用于 IList<T> (T[]“实现”了这两个接口(interface)以及许多其他接口(interface))。

解决方案是不使用接口(interface),而是使用具体类型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; }
}

关于c# - 插入一对多时出现 "Fixed size array"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597298/

相关文章:

c# - 在 .NET 中获取内存配置文件数据

.NET 快速持久队列

c# - 所有获取数据库对象的 linq 都应该用 try catch 包围吗?

c# - Entity Framework : Code First. 共享和实例上下文

c# - 我想使用 Entity Framework 将数据从 CSV 文件导入到 SQL 数据库

c# - WCF 异常 : Could not find a base address that matches scheme http for the endpoint

c# - 如何在 C# 中使用 Regex 匹配给定的模式?

.net - 为什么我的现金抽屉没有出现在 pos for .net 的设备列表中?

c# - 长任务期间的进度条进度

c# - 如何从 Linq 查询返回匿名字段