我正在与EF6合作开展一个小项目。每当我想插入一些OneToMany
或ManyToMany
真实关系的数据时,我都会遇到错误:
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'。
我真的迷失在这个话题上。我尝试了所有我能找到的东西,但没有修复第一个错误。
有人可以帮我理解为什么会出现这些错误,以及如何修复它们?
答案 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; }
}