我正在使用 EF6 开发一个小项目。每当我想插入一些具有 OneToMany
或 ManyToMany
关系的数据时,我都会遇到错误:
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/