C# 在提交时插入关联
我正在使用LinqToSql在Winforms C#应用程序中映射我的数据库 到目前为止,绑定看起来不错,但两个表之间的关系存在问题 它是一种记录对象历史的记录器。在每个日志事件上,都有一个外键链接到导致事件的对象。问题是每次我在日志中创建一行时,另一个表中就会创建一个具有新ID的新对象。我只想使用现有ID的现有对象 将对象插入数据库C# 在提交时插入关联,c#,.net,sql-server,linq-to-sql,C#,.net,Sql Server,Linq To Sql,我正在使用LinqToSql在Winforms C#应用程序中映射我的数据库 到目前为止,绑定看起来不错,但两个表之间的关系存在问题 它是一种记录对象历史的记录器。在每个日志事件上,都有一个外键链接到导致事件的对象。问题是每次我在日志中创建一行时,另一个表中就会创建一个具有新ID的新对象。我只想使用现有ID的现有对象 将对象插入数据库 System.Data.Linq.Table<History> history = dataContext.GetTable<History&
System.Data.Linq.Table<History> history = dataContext.GetTable<History>();
History h = new History()
{
ReadTime = DateTime.Now,
MyObject = o
};
// The "MyObject" is a reference to an existing object.
history.InsertOnSubmit(h);
// OnSubmit a new MyObject is created with a new ID,
// instead of referencing the existing one.
history.Context.SubmitChanges();
System.Data.Linq.DataContext dataContext = new System.Data.Linq.DataContext(connection);
dataContext.GetTable<MyObject>().Attach(o); // Add this line and reattach the MyObject o.
System.Data.Linq.Table<History> history = dataContext.GetTable<History>();
System.Data.Linq.Table history=dataContext.GetTable();
历史h=新历史()
{
ReadTime=DateTime。现在,
MyObject=o
};
//“MyObject”是对现有对象的引用。
历史。InsertOnSubmit(h);
//提交时,将使用新ID创建新的MyObject,
//而不是引用现有的。
history.Context.SubmitChanges();
模型类
[Table(Name = "tbl_History")]
public class History : INotifyPropertyChanged
{
private long m_HistoryID;
private int m_MyObjectFK;
private EntityRef<MyObject> m_MyObject = new EntityRef<MyObject>();
private DateTime m_ReadTime;
[Column(IsPrimaryKey = true, IsDbGenerated = true, Name = "HistoryID")]
public long HistoryID
{
get { return this.m_HistoryID; }
set { this.m_HistoryID = value; }
}
[Column(Storage="m_MyObjectFK")]
public int MyObjectFK
{
get { return this.m_MyObjectFK; }
set { this.m_MyObjectFK= value; }
}
[Association(Name = "FK_tbl_History_tbl_MyObject",
IsForeignKey = true, Storage = "m_MyObject", ThisKey = "MyObjectFK")]
public MyObject MyObject
{
get { return m_MyObject.Entity; }
set
{
m_MyObject.Entity = value;
NotifyPropertyChanged("MyObject");
}
}
[Column(Name = "ReadTime", DbType = "DateTime", CanBeNull = false)]
public DateTime ReadTime
{
get { return m_ReadTime; }
set
{
m_ReadTime = value;
this.NotifyPropertyChanged("ReadTime");
}
}
}
[表(Name=“tbl_历史”)]
公共类历史记录:INotifyPropertyChanged
{
私人长m_历史id;
私人国际m_MyObjectFK;
private EntityRef m_MyObject=new EntityRef();
私有日期时间m_ReadTime;
[列(IsPrimaryKey=true,IsDbGenerated=true,Name=“HistoryID”)]
公共历史图书馆
{
获取{返回this.m_HistoryID;}
设置{this.m_HistoryID=value;}
}
[列(Storage=“m_MyObjectFK”)]
公共int MyObjectFK
{
获取{返回this.m_MyObjectFK;}
设置{this.m_MyObjectFK=value;}
}
[协会(Name=“FK\u tbl\u History\u tbl\u MyObject”,
IsForeignKey=true,Storage=“m_MyObject”,ThisKey=“MyObjectFK”)]
公共MyObject MyObject
{
获取{return m_MyObject.Entity;}
设置
{
m_MyObject.Entity=值;
NotifyPropertyChanged(“MyObject”);
}
}
[列(Name=“ReadTime”,DbType=“DateTime”,CanBeNull=false)]
公共日期时间读取时间
{
获取{return m_ReadTime;}
设置
{
m_ReadTime=值;
此.NotifyPropertyChanged(“ReadTime”);
}
}
}
我已经解决了这个问题。这是因为我试图引用的对象来自另一个DataContext
。在这种情况下,它被识别为新对象。在关联中使用它之前,必须将其重新附加到DataContext
新代码
System.Data.Linq.Table<History> history = dataContext.GetTable<History>();
History h = new History()
{
ReadTime = DateTime.Now,
MyObject = o
};
// The "MyObject" is a reference to an existing object.
history.InsertOnSubmit(h);
// OnSubmit a new MyObject is created with a new ID,
// instead of referencing the existing one.
history.Context.SubmitChanges();
System.Data.Linq.DataContext dataContext = new System.Data.Linq.DataContext(connection);
dataContext.GetTable<MyObject>().Attach(o); // Add this line and reattach the MyObject o.
System.Data.Linq.Table<History> history = dataContext.GetTable<History>();
System.Data.Linq.DataContext-DataContext=new-System.Data.Linq.DataContext(连接);
dataContext.GetTable().Attach(o);//添加此行,然后将MyObject重新连接到o。
System.Data.Linq.Table history=dataContext.GetTable();
在这一链接下回答了一个类似的问题
可能是类似的问题-