10

我是一位经验丰富的 Rails 开发人员,我想我会尝试 ASP.NET 的 MVC 版本。在这样做时,我还决定尝试 Linq->Sql...

我对 Linq->Sql 处理连接的方式有点困惑。

我的架构的一个简单示例是:

书籍
id
标题

类别:
id
名称

book_categories :
book_id
category_id

简单地将这些表拖到 .dbml 文件似乎并没有做到这一点。我在我的 Book 类 book_categories 上获得了一个属性,我期望的是一个可以迭代并直接获取 Category 类的属性。

现在我必须做一些感觉非常错误的事情

        foreach (books_categories bc in book.books_categories)
        {
            category_names.Add(bc.Category.category.Trim());
        }

[回应接受
的答案]我勉强接受了“编写自己的胶水代码”的答案。在继续我对 Linq->Sql 的研究之后,我发现它显然正在慢慢被放开,以支持(更强大的 IMO)实体框架。EF 仍然允许人们使用 LINQ 进行查询,并且像 Ruby 的 ActiveRecord 一样可以很好地确定关系。

4

4 回答 4

8

为 Book 使用部分类实现,并为类别及其属性添加适当的方法。将属性置于 Books_Categories 属性的前端(您可以使其具有私有可见性以通过您的 Categories 属性强制实施)。

public partial class Books
{
    public IEnumerable<string> CategoryNames
    {
       get
       {  
            return this.Books_Categories
                       .Select( bc => bc.Category.category.Trim() );
       }
    }

    public void AddCategory( Category category )
    {
       this.Books_Categories.Add( new Book_Category
                                  {
                                      Category = category,
                                      Book = this
                                  } );
    }

    public void RemoveCategory( Category category )
    {
       var bc = this.Book_Categories
                    .Where( c => c.Category == category )
                    .SingleOrDefault();
       this.Books_Categories.Remove( bc );
    }
}

显然,您需要添加一些错误/边界检查等,但您明白了。

我承认这并不理想,但至少你可以灵活地确定它是如何工作的。

于 2009-01-24T21:30:26.860 回答
2

实体框架明确支持多对多映射,但 LINQ to SQL 不支持。您还可以使用第三方 ORM,例如 NHibernate。

于 2009-01-26T15:49:18.910 回答
0

我认为 Linq to Sql 不支持您的预期结果。

您正在做的事情可能感觉不对,但我认为这是解决 L2S 限制的一种方法。

伙计,我真的必须进入 Rails ......

于 2009-01-24T21:19:14.807 回答
0

如果您想创建一本书并直接向其中添加类别,您可以做的是:在您看来:

        <p>
            <label for="CategorySelect">Category:</label>
            <%= Html.ListBox("CategorySelect") %>
            <%= Html.ValidationMessage("CategorySelect", "*")%>
        </p>  

在您的书籍控制器中:

        public ActionResult New()
    {
            var data = _entities.Categories.ToList();
        ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name");
}

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult New([Bind(Exclude = "Id")] Book Booknew)
    {
        IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { ',' }).Select(idStr => int.Parse(idStr));

        if (!ModelState.IsValid)
            return View();

        try {
            foreach(var item in selectedCategories){
                BooksCategories bc = new BooksCategories();
                bc.Book = Booknew;
                bc.CategoryId = item;
                _entities.BooksCategories.InsertOnSubmit(bc);
            }
            _entities.Books.InsertOnSubmit(Booknew);
            _entities.SubmitChanges();
于 2009-05-12T11:01:27.220 回答