[英]Linq-to-SQL strange behaviour
假设两个表组和用户如下
[Groups] ([Id] [int] NOT NULL, [Name] [nchar](50) NULL);
[Users] ([Id] [int] NOT NULL, [Name] [nchar](50) NULL, [GroupId] [int] NOT NULL);
FOREIGN KEY([GroupId]) REFERENCES [Groups] ([Id])
其中GroupId是用户的外键。
然后,我使用Linq-to-SQL类设计器来创建相关的类,并将以下类添加到项目中
public partial class Group
{
public override int GetHashCode()
{
return (Id.GetHashCode());
}
public override bool Equals(object item)
{
if ((item == null) || (item is System.DBNull))
return (false);
else
{
var temp = item as Group;
if (temp == null)
return (false);
else
if (_Id.Equals(0))
return (_Name.Equals(temp.Name));
else
return (_Id == temp.Id);
}
}
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
var dc = new DB.DataContext();
if (action == System.Data.Linq.ChangeAction.Insert)
if (dc.Groups.Count(o => o.Name.Equals(_Name)) != 0)
throw new Exception("Name Already Exist On Insert");
if (action == System.Data.Linq.ChangeAction.Update)
if (dc.Groups.Count(o => (!o.Id.Equals(_Id) && o.Name.Equals(_Name))) != 0)
throw new Exception("Name Already Exist On Update");
}
}
public partial class User
{
public override int GetHashCode()
{
return (Id.GetHashCode());
}
public override bool Equals(object item)
{
if ((item == null) || (item is System.DBNull))
return (false);
else
{
var temp = item as User;
if (temp == null)
return (false);
else
if (_Id.Equals(0))
return (_Name.Equals(temp.Name));
else
return (_Id == temp.Id);
}
}
}
和
public static DB.Group f1()
{
DB.DataContext dc = new DB.DataContext();
if (dc.Groups.Count() == 0)
{
DB.Group group = new DB.Group() { Name = "admins" };
dc.Groups.InsertOnSubmit(group);
dc.SubmitChanges();
}
return dc.Groups.First();
}
public static void f2(DB.Group group, string name)
{
DB.DataContext dc = new DB.DataContext();
DB.User user = new DB.User() { Name = name, GroupId = group.Id, };
dc.Users.InsertOnSubmit(user);
dc.SubmitChanges();
}
public static void f3(DB.Group group, string name)
{
DB.DataContext dc = new DB.DataContext();
DB.User user = new DB.User() { Name = name, Group = group, };
dc.Users.InsertOnSubmit(user);
dc.SubmitChanges();
}
现在,如果我打电话
DB.Group group = f1();
f2(group, "john");
f2(group, "bob");
然后一切都会好起来,但是如果我打电话
DB.Group group = f1();
f2(group, "john");
f3(group, "bob");
它将引发异常“插入时名称已经存在”。 实际上,已调用OnValidate,并且它检测组表的重复名称。 奇怪的行为是,当要将新用户插入表时,将调用OnValidate。 这是怎么回事? 我做错了吗?
我猜想是因为您正在f3中创建一个新的DataContext,所以它假定您要插入group作为新记录。
您可以手动将组附加到新的DataContext,以便它不会尝试将其插入。
public static void f3(DB.Group group, string name)
{
DB.DataContext dc = new DB.DataContext();
dc.Groups.Attach(group);
DB.User user = new DB.User() { Name = name, Group = group, };
dc.Users.InsertOnSubmit(user);
dc.SubmitChanges();
}
或者,您可以创建一个DataContext,而不是为每个方法创建一个新的DataContext。
Group = group,
在f3中,您将组的实例附加到了用户。 然后,您告诉datacontext插入用户。 因为存在与用户连接的组,并且数据上下文当前未跟踪该组,所以它假定还需要插入该组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.