在提交时插入关联

本文关键字:关联 插入 提交 | 更新日期: 2023-09-27 18:19:28

我正在使用LinqToSql将我的数据库映射到Winforms C#应用程序中。

到目前为止,绑定看起来不错,但两个表之间的关系存在问题。

它是一种记录对象历史的记录器。在每个日志事件上,都有一个外键链接到导致该事件的对象。问题是,每次我在日志中创建一行时,都会在另一个表中创建一个具有新ID的新对象。我只想使用现有ID的现有对象。

将对象插入数据库

 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(); 

模型类

[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");
        }
    }
}

在提交时插入关联

我已经解决了这个问题。发生这种情况是因为我试图引用的对象来自另一个DataContext。在这种情况下,它被识别为一个新对象。在关联中使用它之前,必须将它重新附加到DataContext

新代码

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>();

在这个链接下也回答了类似的问题。

为什么LINQ到SQL实体关联在插入新记录时会创建一个新的(重复的)行?