首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq-to-SQL奇怪行为

Linq-to-SQL奇怪行为
EN

Stack Overflow用户
提问于 2013-09-14 14:10:47
回答 2查看 162关注 0票数 0

假设两个表组和用户如下

代码语言:javascript
复制
[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到SQL类设计器创建相关的类,并将下面的类添加到项目中。

代码语言:javascript
复制
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);
        }
    }
}

代码语言:javascript
复制
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();
}

现在如果我打电话

代码语言:javascript
复制
DB.Group group = f1();
f2(group, "john");
f2(group, "bob");

一切都很好,但如果我打电话

代码语言:javascript
复制
DB.Group group = f1();
f2(group, "john");
f3(group, "bob");

它抛出一个异常“插入上已经存在的名称”。实际上,已经调用了OnValidate,它检测组表的重复名称。奇怪的是,当要将新用户插入到表中时,会调用OnValidate。到底怎么回事?我犯了什么错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 14:33:07

我猜,因为您在f3中创建了一个新的f3,所以它假设您想要插入组作为一个新记录。

您可以手动将组附加到新的DataContext,这样它就不会尝试插入它。

代码语言:javascript
复制
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,而不是为每个方法创建一个新的方法。

票数 0
EN

Stack Overflow用户

发布于 2013-09-14 15:24:37

代码语言:javascript
复制
Group = group,

在f3中,您将组的实例附加到用户。然后告诉数据文本插入用户。因为存在连接到用户的组,而且数据文本当前没有跟踪该组,所以它假设也需要插入组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18802635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档