【问题标题】:Trouble with LINQ: Reading objects from database, getting exceptionsLINQ 的问题:从数据库中读取对象,获取异常
【发布时间】:2012-12-23 12:25:24
【问题描述】:

我对 LINQ 很陌生,但遇到了一些问题。我已经尝试了一段时间的谷歌搜索,但我仍然没有找到任何准确的答案来解决我的问题,所以我也会问。

我在 Microsoft SQL Server 上建立了一个测试数据库,其中包含两个表“Person2”和“Department2”。 Person2 与 Department2 具有多对一的关系。许多人只属于一个部门。

Person2 具有以下属性:

  • id (int, Primary Key)
  • 名称 (nchar(50))
  • 电话号码 (nchar(10))
  • DepartmentID(int,外键名称:“fk_Department2_DepartmentID”)

Department2 具有以下属性:

  • 部门ID(整数,主键)
  • DepartmentDesc (nchar(50))

C# 代码由两个项目文件中的四个类组成:一个是 Person、Department 和 Program(运行测试),另一个是 TabellTest。 这是我要运行的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace DBTest
{
    [Database]
    public class TableTest : DataContext 
    {
        public Table<Person> persons;
        public Table<Department> departments;

        public TabellTest(String ConnectionString):
            base(ConnectionString){}

    }

}


using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace DBTest
{
    [Table(Name = "Person2")]
    public class Person
    {

        public Person() { }

        [Column(IsPrimaryKey = true)]
        private int id;
        public int Id
        {
            get { return this.id; }
            set { this.id = value; }
        }

        [Column]
        private string name;
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        [Column]
        private string phoneNumber;
        public string PhoneNumber
        {
            get { return this.phoneNumber;}
            set { this.phoneNumber = value;}
        }

        [Column (Name="DepartmentID")]
        private int? personDepartmentID;
        public int? PersonDepartmentID
        {
            get { return this.personDepartmentID; }
            set { this.personDepartmentID = value; }
        }

        [Association(Name = "FK_Person_PersonDepartment",
        IsForeignKey = true, Storage = "_department", ThisKey = "personDepartmentID")]
        private EntityRef<Department> _department;
        public Department Department
        {
            get { return _department.Entity; }
            set { _department.Entity = value; }
        }



    }

    [Table (Name = "Department2")]
    public class Department {

        public Department() { }

        public Department(int departmentID, string departmentDesc)
        {
            this.departmentID = deparmentID;
            this.departmentDesc = departmentDesc;
        }

        [Column(IsPrimaryKey = true)]
        private int departmentID;
        public int DepartmentID
        {
            get {return this.departmentID; }
            set {this.departmentID = value; }
        }

        [Column]
        private string departmentDesc;
        public string DepartmentDesc
        {
            get { return this.departmentDesc; }
            set { this.departmentDesc = value; }
        }

        private EntitySet<Person> _person = new EntitySet<Person>();
        [Association(Name = "FK_Person_PersonDepartment",
        IsForeignKey = true, Storage = "_person", ThisKey = "departmentID", OtherKey="personDepartmentID")]
        public EntitySet<Person> person
        {
            get { return _person; }
            set { _person = value; } 
        }


    }

    class Program
    {
        static void Main(string[] args)
        {
            TableTest Test = new TableTest("REMOVED FOR STACKOVERFLOW.COM, JUST ASSUME IT WORKS");

            foreach (Person pers in Test.persons)
            {
                Console.WriteLine(pers.Name + " " + pers.Id + " " + pers.PhoneNumber + " " + pers.Department.DepartmentID + " " + pers.Department.DepartmentDesc);
            }

            Console.WriteLine("\n\n");
            foreach (Department dep in Test.department)
            {
                Console.WriteLine(dep.DepartmentID + " " + dep.DepartmentDesc);
                foreach (Person pers in dep.person)
                {
                    Console.WriteLine(pers.Name + " " + pers.Id + " " + pers.PhoneNumber);
                }
            }

        }
    }
}

问题的核心是Person类中的这段代码:

    [Association(Name = "FK_Person_PersonDepartment", IsForeignKey = true, 
    Storage = "_department", ThisKey = "personDepartmentID")]
    private EntityRef<Department> _department;
    public Department Department
    {
        get { return _department.Entity; }
        set { _department.Entity = value; }
    }

每当我尝试运行程序时,我都会收到以下异常:

未处理的异常:System.InvalidOperationException:ThisKey 列的数量与“Person”类型中关联属性“_department”的 OtherKey 列的数量不同 在.......等等等等等等

我在谷歌上搜索问题时发现的一个解决方案建议我将OtherKey属性添加到关联中,在这种情况下,关联代码变成这样:

[Association(Name = "FK_Person_PersonDepartment", IsForeignKey = true, 
Storage = "_department", ThisKey = "personDepartmentID", OtherKey = "departmentID")]

(我也尝试过使用大写 D:OtherKey = "DepartmentID")]

当我这样做时,我得到了这个异常:

未处理的异常:System.InvalidOperationException:在类型“EntityRef 1´. The key may be wrong or the field or property on ´EntityRef1”上找不到键“departmentID”的键成员“departmentID”已更改名称。 在 ....etc 等等等等

具有讽刺意味的是,与 EntitySet 一起操作的 Department 的关联段使用两个键(刚刚打开 ThisKey 和 OtherKey),并且可以正常工作。 换句话说:我无法从 Person 类的数据库中获取 Department 对象,而它可以在 Department-code 中获取 Person 对象集。

现在,亲爱的读者和程序员,你建议我做什么?

【问题讨论】:

    标签: c# .net linq-to-sql


    【解决方案1】:

    看起来可能只是命令 - 您正在修改私有成员而不是公共成员;你试过吗?

    private EntityRef<Department> _department;
    [Association(Name = "FK_Person_PersonDepartment", IsForeignKey = true,
       Storage = "_department", ThisKey = "personDepartmentID", OtherKey = "departmentID")]
    public Department Department
    {
      get { return _department.Entity; }
      set { _department.Entity = value; }
    }
    

    【讨论】:

    • (作者用自己的头撞在桌子上)Doh!...现在可以了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2021-07-29
    • 2020-04-08
    • 1970-01-01
    • 2022-11-10
    • 2014-01-01
    • 2013-04-17
    相关资源
    最近更新 更多