我是一位经验丰富的Rails开发人员,我想我会试用ASP.NET的MVC版本。这样做我还决定尝试Linq-> Sql ...
我对Linq-> Sql处理连接的方式感到有点困惑。
我的架构的一个简单例子是:
书:
ID
标题
类别:
ID
名称
books_categories :
book_id
CATEGORY_ID
简单地将这些表拖到.dbml文件似乎不会这样做。我在Book class books_categories上获得了一个属性,我期望的是一个属性,我可以迭代并直接获得Category类。
现在我必须做一些感觉非常错误的事情
foreach (books_categories bc in book.books_categories)
{
category_names.Add(bc.Category.category.Trim());
}
[回应接受回答]
我勉强接受了“编写自己的胶水代码”的答案。在继续我对Linq-> Sql的研究之后,我发现它显然正在慢慢放弃(更强大的IMO)实体框架。 EF仍允许使用LINQ进行查询,并且可以很好地找出像Ruby的ActiveRecord这样的关系。
答案 0 :(得分: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 );
}
}
显然,你需要添加一些错误/边界检查等,但你明白了。
我会告诉你这不太理想,但至少你可以灵活地确定它是如何运作的。
答案 1 :(得分:2)
实体框架中明确支持多对多映射,但LINQ to SQL中不支持。您也可以使用第三方ORM,例如NHibernate。
答案 2 :(得分:0)
我认为Linq to Sql不支持您的预期结果。
你在做什么可能会感觉不对,但我认为这是解决L2S限制的一种方法。
伙计,我真的要进入Rails ......
答案 3 :(得分: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();