使用LINQ进行多对多映射

时间:2010-06-11 21:10:05

标签: linq orm many-to-many

我想在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; }
}

那么我做错了什么?如何插入不属于任何类别的帖子?如何插入没有帖子的类别?

1 个答案:

答案 0 :(得分:0)

似乎错误与映射无关。映射是正确的 正如我所写,第一篇文章插入没有问题,其余的插入失败。从数据库中删除后,我仍然无法添加帖子。很明显,它与DB中的某些东西没有任何关系,只是因为我对代码进行了一些更改。

那么有什么变化?在Apress“ASP.NET MVC Pro”中,第一个示例说明了一种以迭代方式验证数据的方法(非声明性,使用IDataErrorInfo提供的设施),我坚持使用。我通过该示例完成了所有操作,并且应该验证输入的函数调用搞砸了我的数据流,并在提交到数据库时抛出了该异常。

删除了验证,一切正常。

抱歉是误报。