2

私はLINQを初めて使用しますが、いくつか問題があります。しばらくグーグルを試しましたが、まだ正確な答えが見つからないので、質問します。

Microsoft SQL Serverに、「Person2」と「Department2」の2つのテーブルを使用してテストデータベースを作成しました。Person2はDepartment2と多対1の関係にあります。多くの人が1つの部門にのみ属しています。

Person2には次の属性があります。

  • id(int、主キー)
  • 名前(nchar(50))
  • phoneNumber(nchar(10))
  • DepartmentID(int、名前が「fk_Department2_DepartmentID」の外部キー)

Department2には次の属性があります。

  • DepartmentID(int、主キー)
  • DepartmentDesc(nchar(50))

C#コードは、2つのプロジェクトファイルの4つのクラスで構成されています。1つはPerson、Department、Program(テストを実行)、もう1つは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:タイプ「EntityRef1」のキー「departmentID」のキーメンバー「departmentID」が見つかりませんでし1´. The key may be wrong or the field or property on ´EntityRefた。名前が変更されました。....etcなどで

皮肉なことに、EntitySetで動作するDepartmentのAssociation-segmentは、両方のキー(ThisKeyとOtherKeyをオンにしただけ)を使用して機能します。言い換えると、PersonクラスのデータベースからDepartmentのオブジェクトを取得するのに問題がありますが、DepartmentコードのPersonのオブジェクトのセットを取得することはできます。

さて、親愛なる読者とプログラマー、あなたは私が何をすることを提案しますか?

4

1 に答える 1

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; }
}
于 2013-01-09T17:37:42.390 に答える