Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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#_.net_Sql Server_Linq To Sql - Fatal编程技术网

C# 在提交时插入关联

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&

我正在使用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(); 
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();
在这一链接下回答了一个类似的问题

可能是类似的问题-