LINQ to SQL Insert (отношение один ко многим с использованием пользовательских классов сущностей и атрибута [Association]) - PullRequest
2 голосов
/ 18 марта 2011

В настоящее время я углубляюсь в LINQ to SQL, поскольку он выглядит круто и потенциально во многих случаях гораздо полезнее, чем ADO.NET.

Раньше я использовал LINQ to SQL, но я создал все классы домена с помощью конструктора классов LINQ to SQL, и я не очень хочу его использовать, так как предпочел бы знать, что происходит «за кулисами». вместо того, чтобы положить это. Магия .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, я получаю старый добрый 'Ссылка на объект не установлена ​​на экземпляр объекта' error.

Теперь проблема должна заключаться в том, что я использую для хранения LeaderId при добавлении новой сущности Meet. Я устанавливаю внешний ключ в моем объекте так:

Meet meet = new Meet();

meet.Leader.MemberId = 1;

Однако, когда я выполняю вставку LINQ, кажется, что он не понимает, что MemberId свойства Leader - это значение, которое нужно вставить в столбец внешнего ключа в таблице Meets .

Я понимаю, что это, вероятно, можно решить, добавив отдельное свойство в класс Meet следующим образом:

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

Однако я не хочу загромождать свой класс дополнительным свойством, которое является дубликатом свойства MemberId свойства Leader.

Надеюсь, ты меня понимаешь ... Кто-нибудь может помочь?

1 Ответ

1 голос
/ 18 марта 2011

Я решил эту проблему, мне пришлось добавить дополнительное свойство 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; }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...