C# 实体在我希望它附着时插入

C# 实体在我希望它附着时插入,c#,entity-framework,ef-code-first,poco,C#,Entity Framework,Ef Code First,Poco,我有两门课: public class PartDefinition { public int Id { get; set; } [Required] [MaxLength(10)] public string PartNumber { get; set; } [Required] public virtual Module Module { get; set; } } public class Module { public int

我有两门课:

public class PartDefinition
{
    public int Id { get; set; }

    [Required]
    [MaxLength(10)]
    public string PartNumber { get; set; }

    [Required]
    public virtual Module Module { get; set; }
}

public class Module
{
    public int Id { get; set; }

    [Required]
    [MaxLength(10)]
    public string Name { get; set; }
}
然后我尝试执行以下操作:

PartDefinition part = new PartDefinition(partNumber, module);
context.PartDefinitions.Add(part);
context.SaveChanges();
数据库中已存在传递给新零件定义的模块。但是,当我保存新的零件定义而不是将当前模块作为外键添加时,它会插入一个全新的模块


如何更改此设置?

您确定模块对象的Id已设置为值吗?如果为零,则实体框架将其视为新关系。

因为您没有任何表示数据库中主键的[Key]属性;它每次都会添加一个新模块。尝试使用[Key]属性标记Id属性。
在获取模块和插入部件时,也尝试使用相同的上下文实例。

我已经尝试过,但结果仍然相同。此外,我知道命名var Id会告诉EF这是主键Id。@RickEyre正在使用相同的上下文获取模块并保存新部件?不,我不是。它们应该是一样的吗?好吧,我切换到使用相同的上下文,现在可以了。有没有一种方法可以让我使用两个不同的上下文,但仍然获得相同的行为?@RickEyre为了使用两个不同的上下文,您需要在添加部件之前将模块项附加到上下文。还有一个0分的答案:)也考虑在PartDefinition中添加一个ID值
public int ModuleId{get;set;}public虚拟模块{get;set;}
关于您的代码示例,您已经列出了使用构造函数创建
PartDefinition
的过程,但之前没有定义它,对吗?