C# “LINQ到SQL”;INSERT语句与外键约束“冲突”;FK“儿童”和“父母”&引用;

C# “LINQ到SQL”;INSERT语句与外键约束“冲突”;FK“儿童”和“父母”&引用;,c#,linq-to-sql,C#,Linq To Sql,我在尝试使用导航属性将数据插入表时遇到了SqlException。外键似乎不会自动更新,默认值为0。同时,它也适用于自动生成的类。我不想使用自动生成的模型 我必须如何修改我的模型才能工作?是关于InotifyPropertyChange还是INotifyPropertyChanged 谢谢 class Program { static void Main(string[] args) { var db = new DbContext(); var

我在尝试使用导航属性将数据插入表时遇到了SqlException。外键似乎不会自动更新,默认值为0。同时,它也适用于自动生成的类。我不想使用自动生成的模型

我必须如何修改我的模型才能工作?是关于InotifyPropertyChange还是INotifyPropertyChanged

谢谢

class Program
{
    static void Main(string[] args)
    {
        var db = new DbContext();
        var p = db.Parents.Single(x => x.Id == 2);
        p.Children.Add(new Child_ { Name = "P2_Child_1" });
        db.SubmitChanges();
    }
}


class DbContext : DataContext
{
    public DbContext() : base(@"Data Source=.\SQLEXPRESS;Initial Catalog=TestDb;Integrated Security=True;") { }
    public Table<Parent_> Parents { get { return GetTable<Parent_>(); } }
    public Table<Child_> Children { get { return GetTable<Child_>(); } }
}

[Table(Name = "Parents")]
class Parent_
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column]
    public string Name { get; set; }

    [Association(OtherKey = "ParentId")]
    public EntitySet<Child_> Children { get; set; }

}

[Table(Name = "Children")]
class Child_
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column]
    public int ParentId { get; set; }

    [Column]
    public string Name { get; set; }

    [Association(IsForeignKey = true, ThisKey = "ParentId", OtherKey = "Id")]
    public Parent_ Parent { get; set ; }
}
类程序
{
静态void Main(字符串[]参数)
{
var db=new DbContext();
var p=db.Parents.Single(x=>x.Id==2);
p、 添加(new Child{Name=“P2_Child_1”});
db.SubmitChanges();
}
}
类DbContext:DataContext
{
public DbContext():base(@“数据源=。\SQLEXPRESS;初始目录=TestDb;集成安全性=True;”){}
公共表父项{get{return GetTable();}}
公共表子项{get{return GetTable();}}
}
[表(Name=“Parents”)]
班级家长_
{
[列(IsPrimaryKey=true,IsDbGenerated=true)]
公共int Id{get;set;}
[专栏]
公共字符串名称{get;set;}
[关联(OtherKey=“ParentId”)]
公共EntitySet子项{get;set;}
}
[表(Name=“Children”)]
班童_
{
[列(IsPrimaryKey=true,IsDbGenerated=true)]
公共int Id{get;set;}
[专栏]
public int ParentId{get;set;}
[专栏]
公共字符串名称{get;set;}
[关联(IsForeignKey=true,ThisKey=“ParentId”,OtherKey=“Id”)]
公共父项{Parent{get;set;}
}

要解决此问题,我必须在继承的DataContext上手动编写Insert方法:

Public Class ClientDataContext : Inherits DataContext

...

Public Sub InsertYourEntity(instance As YourEntity)
    With instance
        ExecuteDynamicInsert(instance)
        If TypeOf instance Is YourEntity then
            For each child As YourChildEntity In instance.YourChildEntities
                child.YourForeignKeyId = .Id
            Next
        End If
    End With
End Sub

LinqToSql似乎通过反射使用此方法。因此,一旦编写了resharper,它就不会被使用,但是集成测试成功了。

您的类必须与SQL Server中的数据库相匹配。因此,首先使用SQLServer附带的SQLServerManagementStudio(SSMS)打开数据库。在SSMS中使用资源管理器验证数据库中的密钥。然后更正您的类以匹配服务器。@jdweng“验证”是什么意思?我可以使用我的模型从数据库中获取数据,我可以获取连接到父级的子级集合,但无法使用新子级保存父级。如果使用SSMS连接到数据库。使用资源管理器,您可以找到数据库和表。然后查看列和键。