Я хотел бы выполнить сопоставление 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; }
}
Так что я делаю не так? Как сделать так, чтобы можно было вставить пост, который не относится ни к одной категории? Как вставить категории без постов?