Как сопоставить с Linq для SQL один ко многим - PullRequest
0 голосов
/ 30 мая 2011

У меня есть таблица 'Article'

private int id;
    [ColumnAttribute(Storage = "id", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string title;
    [ColumnAttribute(Storage = "title", DbType = "NVarChar(250) NOT NULL", CanBeNull = false)]
    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    private string description;
    [ColumnAttribute(Storage = "description", DbType = "NVarChar(350) NOT NULL", CanBeNull = false)]
    public string Description
    {
        get { return description; }
        set { description = value; }
    }

и комментарий к таблице

 [Table(Name = "dbo.Comments")]
public class CommentDto
{
    private int id;
    [ColumnAttribute(Storage = "id", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string content;
    [ColumnAttribute(Storage = "content", DbType = "NVarChar(600) NOT NULL", CanBeNull = false)]
    public string Content
    {
        get { return content; }
        set { content = value; }
    }

    private string date;
    [ColumnAttribute(Storage = "date", DbType = "DateTime NOT NULL", CanBeNull = false)]
    public string Date
    {
        get { return date; }
        set { date = value; }
    }
}

Одна статья может иметь много комментариев, и каждый комментарий может разместить пользователь

[TableAttribute(Name = "dbo.Users")]
public class UserDto
{
    private int id;
    [ColumnAttribute(Storage = "id", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string username;
    [ColumnAttribute(Storage = "username", DbType = "NVarChar(150) NOT NULL", CanBeNull = false)]
    public string Username
    {
        get { return username; }
        set { username = value; }
    }

Как мне сопоставить связь между этими таблицами?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2011

Вы можете прочитать о сопоставлении ассоциаций здесь .

В вашем случае:

class Article
{
    private EntitySet<CommentDto> _Comments;

    [Association(OtherKey = "ArticleID")]
    public virtual IList<CommentDto> Comments
    {
            get
            {
                if (_Comments == null)
                    _Comments = new EntitySet<CommentDto>();
                return _Comments;
            }
            set
            {
                Comments.Assign(value);
            }
    }
}

class Comment
{
    [Association(ThisKey="ArticleID")]
    public ArticleDto Article { get; set; }
}

Конечно, сначала вы должны добавить столбец ArticleID в таблицу комментариев в базе данных.

Часть ниже не представлена ​​в коде MSDN по ссылке выше, но без нее у меня было много проблем с DTO в службе WCF. Итак, теперь я предпочитаю добавлять его в каждую ассоциацию:

if (_Comments == null)
    _Comments = new EntitySet<CommentDto>();
0 голосов
/ 30 мая 2011

Я думаю, вы создаете свои классы таблиц вручную.в этом нет необходимости.

добавьте файл LINQ to SQL (dbml) в свое решение, откройте окно обозревателя серверов и подключитесь к базе данных, перетащите таблицы в дизайн класса dbml.

если в ваших таблицах есть ограничения внешнего ключа, то ссылка создаст соответствующие свойства в обоих классах.

и если вы хотите сделать это вручную (чего я не понимаю, почему),создайте свойство с типом ссылочного класса, и это необходимый атрибут:

[Association(Name="your_fk_constraint_name", Storage="name_of_your_private_backup_field", ThisKey="name_of_the_key_in_this_table", IsForeignKey=true)]

надеюсь, я немного помог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...