Отображение «многие ко многим» с помощью LINQ - PullRequest
1 голос
/ 12 июня 2010

Я хотел бы выполнить сопоставление LINQ to SQL в C #, в отношении многие ко многим, но там, где данные не обязательны.
Чтобы было ясно:
У меня есть новостной сайт / блог, и есть таблица с именем Posts. Блог может относиться ко многим категориям одновременно, поэтому существует таблица с именем CategoriesPosts, которая связывает внешние ключи с таблицей Posts и таблицей Categories. Я создал каждую таблицу с первичным ключом идентификации, полем id в каждой, если это имеет значение в этом случае.
В C # я определил класс для каждой таблицы, определил каждое поле как можно более подробно. Класс Post и класс Category имеют EntitySet для связи с CategoryPost объектами, а класс CategoryPost имеет 2 EntityRef члена для связи с 2 объектами каждого другого типа.

Проблема заключается в том, что сообщение может относиться или не относиться к какой-либо категории, а также в категории могут быть сообщения в ней или нет. Я не нашел способа сделать EntitySet<CategoryPost?> или что-то в этом роде.

Поэтому, когда я добавил первый пост, все прошло хорошо, ни с одним оператором SQL. Также этот пост присутствовал в выводе. Когда я попытался добавить второе сообщение, я получил исключение: Ссылка на объект не установлена ​​на экземпляр объекта относительно элемента CategoryPost.

Сообщение:

[Table(Name="tm_posts")]
public class Post : IDataErrorInfo
{
    public Post()
    {
        //Initialization of NOT NULL fields with their default values
    }

    [Column(Name = "id", DbType = "int", CanBeNull = false, IsDbGenerated = true, IsPrimaryKey = true)]
    public int ID { get; set; }

    private EntitySet<CategoryPost> _categoryRef = new EntitySet<CategoryPost>();
    [Association(Name = "tm_rel_categories_posts_fk2", IsForeignKey = true, Storage = "_categoryRef", ThisKey = "ID", OtherKey = "PostID")]
    public EntitySet<CategoryPost> CategoryRef
    {
        get { return _categoryRef; }
        set { _categoryRef.Assign(value); }
    }
}

CategoryPost

[Table(Name = "tm_rel_categories_posts")]
public class CategoryPost
{
    [Column(Name = "id", DbType = "int", CanBeNull = false, IsDbGenerated = true, IsPrimaryKey = true)]
    public int ID { get; set; }

    [Column(Name = "fk_post", DbType = "int", CanBeNull = false)]
    public int PostID { get; set; }

    [Column(Name = "fk_category", DbType = "int", CanBeNull = false)]
    public int CategoryID { get; set; }

    private EntityRef<Post> _post = new EntityRef<Post>();
    [Association(Name = "tm_rel_categories_posts_fk2", IsForeignKey = true, Storage = "_post", ThisKey = "PostID", OtherKey = "ID")]
    public Post Post
    {
        get { return _post.Entity; }
        set { _post.Entity = value; }
    }

    private EntityRef<Category> _category = new EntityRef<Category>();
    [Association(Name = "tm_rel_categories_posts_fk", IsForeignKey = true, Storage = "_category", ThisKey = "CategoryID", OtherKey = "ID")]
    public Category Category
    {
        get { return _category.Entity; }
        set { _category.Entity = value; }
    }
}

Категория

[Table(Name="tm_categories")]
public class Category
{
    [Column(Name = "id", DbType = "int", CanBeNull = false, IsDbGenerated = true, IsPrimaryKey = true)]
    public int ID { get; set; }

    [Column(Name = "fk_parent", DbType = "int", CanBeNull = true)]
    public int ParentID { get; set; }

    private EntityRef<Category> _parent = new EntityRef<Category>();
    [Association(Name = "tm_posts_fk2", IsForeignKey = true, Storage = "_parent", ThisKey = "ParentID", OtherKey = "ID")]
    public Category Parent
    {
        get { return _parent.Entity; }
        set { _parent.Entity = value; }
    }

    [Column(Name = "name", DbType = "varchar(100)", CanBeNull = false)]
    public string Name { get; set; }
}

Так что я делаю не так? Как сделать так, чтобы можно было вставить пост, который не относится ни к одной категории? Как вставить категории без постов?

1 Ответ

0 голосов
/ 12 июня 2010

Кажется, что ошибка не имеет ничего общего с отображением.Сопоставление правильное.
Как я уже писал, первое сообщение вставлено без проблем, а остальные не удалось вставить.После удаления из базы данных я все еще не мог добавлять сообщения.Стало ясно, что это никак не связано с тем, что у меня есть что-то в БД или нет, и только с тем фактом, что я внес некоторые изменения в код.

Так что же это за изменения?В Apress «ASP.NET MVC Pro» первый пример иллюстрировал способ проверки данных итеративным способом (не декларативным, с использованием средств, предоставляемых IDataErrorInfo), к которым я привязался.Я сделал все на этом примере, и вызов функции, которая должна была проверить входные данные, испортил мой поток данных и выдал это исключение при отправке в базу данных.

Удалил эту проверку, и все работало нормально.

Извините за ложные срабатывания.

...