无法在实体框架中保存具有一对多关系的新实体

时间:2016-12-09 18:26:07

标签: c# entity-framework entity-framework-6

当尝试使用一对多关系保存两个新实体时,我收到以下错误:

  

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我使用的是EF v6.1.3

以下是代码示例:

var entity = _dbContext.Set<EntityA>().Create();

entity.Identifier = 1234;
entity.Title = "Test Title";
entity.Description = "Test Description";

_dbContext.Set<EntityA>().Add(entity);

var relatedEntity = _dbContext.Set<EntityB>().Create();

relatedEntity.Identifier = "123-1234";
relatedEntity.Title = "Test Title";
relatedEntity.Statement = "Sample Statement";
relatedEntity.Entity = entity;

_dbContext.Set<EntityB>().Add(relatedEntity);
_dbContext.SaveChanges();

我可以解决这个错误的唯一方法是在创建相关实体之前调用_dbContext.SaveChanges();

非常感谢任何帮助。

修改

以下是表格的SQL:

CREATE TABLE [dbo].[EntityA]
(
    [Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [Identifier] NVARCHAR (100) NULL,
    [Title] NVARCHAR(100) NULL,
    [Description] NVARCHAR (2000) NULL
)

CREATE TABLE [dbo].[EntityB]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Identifier] NVARCHAR (100) NULL,
    [Title] NVARCHAR(100) NULL,
    [Statement] NVARCHAR (2000) NOT NULL,
    [EntityAId] INT NOT NULL,
    CONSTRAINT [FK_EntityB_EntityA] FOREIGN KEY ([EntityAId]) REFERENCES [EntityA]([Id])
)

以下是OnModelCreating配置:

modelBuilder.Entity<EntityA>()
    .HasMany(e => e.RelatedEntities)
    .WithRequired(e => e.EntityA)
    .HasForeignKey(e => e.EntityAId);

以下是实体类:

[Table("EntityA")]
public class EntityA
{
    public int Id { get; set; }

    public string Identifier { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }

    public virtual IList<EntityB> RelatedEntities { get; set; }
}

[Table("EntityB")]
public class EntityB
{
    public int Id { get; set; }

    public int EntityAId { get; set; }

    public string Identifier { get; set; }

    public string Title { get; set; }

    public string Statement { get; set; }
}

1 个答案:

答案 0 :(得分:0)

当您创建Entity2时,Entity(1)尚未出现在数据库中,而Entity2需要有1个可用于创建自身。你做正确的事情来调用SaveChanges()来首先创建实体(1)。