我目前正在深入研究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属性重复的额外属性来混乱我的类。
希望你理解我...... 有人可以帮忙吗?
答案 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; }
}
}