我想在C#中以多对多关系执行LINQ to SQL映射,但数据不是强制性的。
要明确:
我有一个新闻网站/博客,还有一个名为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; }
}
那么我做错了什么?如何插入不属于任何类别的帖子?如何插入没有帖子的类别?
答案 0 :(得分:0)
似乎错误与映射无关。映射是正确的 正如我所写,第一篇文章插入没有问题,其余的插入失败。从数据库中删除后,我仍然无法添加帖子。很明显,它与DB中的某些东西没有任何关系,只是因为我对代码进行了一些更改。
那么有什么变化?在Apress“ASP.NET MVC Pro”中,第一个示例说明了一种以迭代方式验证数据的方法(非声明性,使用IDataErrorInfo
提供的设施),我坚持使用。我通过该示例完成了所有操作,并且应该验证输入的函数调用搞砸了我的数据流,并在提交到数据库时抛出了该异常。
删除了验证,一切正常。
抱歉是误报。