Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-子项具有复合主键时子项的父项-插入错误_C#_Sql_Entity Framework_Ef Code First - Fatal编程技术网

C# 实体框架-子项具有复合主键时子项的父项-插入错误

C# 实体框架-子项具有复合主键时子项的父项-插入错误,c#,sql,entity-framework,ef-code-first,C#,Sql,Entity Framework,Ef Code First,我有以下两门课: public class Parent { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Child> Children { get; set; } public Parent() { Children = new List<Child>(); } } pu

我有以下两门课:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Child> Children { get; set; }

    public Parent()
    {
        Children = new List<Child>();
    }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int? ParentId { get; set; }
    public virtual Parent Parent { get; set; }
}
我认为整数主键是在插入时自动生成的。我该怎么办?我是否应该将键更改为字符串并在C中创建GUID键以使其正常工作?

我认为对于组合键,默认情况下键的任何部分都不会标记为标识,即使对于简单的非组合键,整数键也是如此。您可能必须将Identity选项显式添加到子实体的Id属性:

modelBuilder.Entity<Child>()
    .Property(c => c.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

我有点担心你孩子钥匙的第二部分可以为空。也许EF确实允许这样做,但数据库不一定允许这样做:我认为,以SQL Server为例,可以为空的关键部分是被禁止的。也许,其他数据库可以处理这个问题。很明显,您的目标是建立一种标识关系,即当从父对象中删除子对象时,从数据库中删除该子对象,但该子对象在父对象和子对象之间需要一种必需的而不是可选的关系,据我所知。

您是否尝试在子实体id的顶部添加键属性。我知道您已经通过fluentapi进行了添加。我将使用sql profiler查看sql server中生成的内容。将其设置为删除时级联,不要用可选部分组成假键。删除时级联将起作用,但此时我删除父项,同时也将删除其子项。问题是,parent.Children.Removechild只是从数据库中删除关系,而不是子关系。这是因为您说过。HasOptionalc=>c.parent.Changed all key to string,并手动在c中生成GUID,并将.HasOptional改为.HasRequired-按预期工作。我只是不明白为什么它不适用于整数。
Parent p = new Parent { Name = "Quarterbacks" };
            p.Children.Add(new Child { Name = "Brady" });
            p.Children.Add(new Child { Name = "P. Manning" });
            p.Children.Add(new Child { Name = "Kaepernick" });
            p.Children.Add(new Child { Name = "Wilson" });
            p.Children.Add(new Child { Name = "Rodgers" });

            db.Parents.Add(p);

            db.SaveChanges();
modelBuilder.Entity<Child>()
    .Property(c => c.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);