C# “LINQ到SQL”;INSERT语句与外键约束“冲突”;FK“儿童”和“父母”&引用;
我在尝试使用导航属性将数据插入表时遇到了SqlException。外键似乎不会自动更新,默认值为0。同时,它也适用于自动生成的类。我不想使用自动生成的模型 我必须如何修改我的模型才能工作?是关于InotifyPropertyChange还是INotifyPropertyChanged 谢谢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
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连接到数据库。使用资源管理器,您可以找到数据库和表。然后查看列和键。