LINQ to SQL Insert(使用自定义实体类和[Association]属性的一对多关系)

时间:2011-03-18 15:12:22

标签: linq-to-sql

我目前正在深入研究LINQ to SQL,因为它看起来很酷,并且在很多情况下可能比ADO.NET更有用。

之前我使用过LINQ to SQL,但是我使用LINQ to SQL Class设计器创建了所有域类,我真的不想使用它,因为我宁愿知道“幕后”会发生什么而不是把它放下.NET魔法。因此,我一直在尝试使用LINQ属性手动创建我的域(或实体)类。

我发现这一切都很好,直到我试图在我的数据库中建立一对多的关系时遇到问题。有一个表 Meets ,其中包含 LeaderId 列,这是表成员

的外键

这就是我设置实体类的方法:

Meet.cs

[Table(Name = "dbo.Meets")]
public class Meet
{
    private EntityRef<Member> _leader;

    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int MeetId { get; set; }

    [Column]
    public string Location { get; set; }

    [Column]
    public DateTime Date { get; set; }

    [Association(Name = "FK_Meets_Members", Storage = "_leader")]
    public Member Leader
    {
        get { return _leader.Entity; }
        set { _leader.Entity = value; }
    }
}

Member.cs

[Table(Name = "dbo.Members")]
    public class Member
    {
        private EntitySet<Meet> _meets;

        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int MemberId { get; set; }

        [Column]
        public string Name { get; set; }

        [Column]
        public string Hometown { get; set; }

        [Column]
        public string Info { get; set; }

        [Column]
        public ComitteeRole ComitteeRole { get; set; }

        [Association(Name = "FK_Meets_Members", Storage = "_meets")]
        public ICollection<Meet> Meets
        {
            get { return _meets; }
            set { _meets.Assign(value); }
        }
    }

在Meets表上选择工作,同样在Members表上选择工作,并且关联的实体被正确加载。但是,当我尝试插入Meets表时,我得到的是旧的'对象引用未设置为对象'错误的实例。

现在问题在于我在添加新的Meet实体时用于存储 LeaderId 的问题。我在我的对象中设置外键如下:

Meet meet = new Meet();

meet.Leader.MemberId = 1;

但是,当我在进行LINQ插入时,似乎并不理解Leader属性的MemberId是放在 Meets 表中的外键列中的值。

我意识到这可以通过向 Meet 类添加单独的属性来解决,如下所示:

[Column]
public int LeaderId { get; set; }

但是,我不想使用与Leader属性的MemberId属性重复的额外属性来混乱我的类。

希望你理解我...... 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我想出了这个问题,我确实需要添加额外的LeaderId属性来表示外键,然后将其标记为Associate属性中的外键,名为参数'ThisKey',如下所示:

<强> Meet.cs

    [Table(Name = "dbo.Meets")]
    public class Meet
    {
        private EntityRef<Member> _leader;

        public Meet()
        {
            _leader = default(EntityRef<Member>);
        }

        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int MeetId { get; set; }

        [Column]
        public string Location { get; set; }

        [Column]
        public DateTime Date { get; set; }

        [Column]
        public int LeaderId { get; set; }

        [Association(Name = "Member_Meet", Storage = "_leader", ThisKey = "LeaderId", OtherKey = "MemberId", IsForeignKey = true)]
        public Member Leader
        {
            get { return _leader.Entity; }
            set { _leader.Entity = value; }
        }
    }