我正在构建我的第一个MVC应用程序原型,这是一个简单的论坛。我已经完成了域模型的一部分,我正在试图弄清楚如何在SQL中做一些非常基本的东西,但我无法在我的应用程序中找到它。以下是我的实体:
[Table(Name="Users")]
public class User
{
[Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
public int Id { get; set; }
[Column] public string Username { get; set; }
[Column] public string Password { get; set; }
[Column] public string PasswordHash { get; set; }
[Column] public string PasswordSalt { get; set; }
[Column] public string FirstName { get; set; }
[Column] public string LastName { get; set; }
public List<Forum> AllowedForums { get; set; }
[Column] public DateTime LastLogin { get; set; }
[Column] public DateTime MemberSince { get; set; }
}
[Table(Name="Forums")]
public class Forum
{
[Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
public int Id { get; set; }
[Column] public int ParentId { get; set; }
[Column] public string Title { get; set; }
[Column] public string Description { get; set; }
[Column] public bool IsGlobal { get; set; }
[Column] public int DisplayOrder { get; set; }
}
我还有一个名为AllowedForums的链接表,如下所示:
userid forumid
1 4
为了选择允许用户查看的论坛和IsGlobal == true的论坛,我在SQL中执行此操作:
SELECT * FROM Forums
LEFT OUTER JOIN AllowedForums ON Forums.id = AllowedForums.Forumid
WHERE AllowedForums.Userid = 1
OR Forums.IsGlobal = 1
我应该如何填充
public List<Forum> AllowedForums
字段使用C#/ Linq to SQL?
AllowedForum应该是一个具有自己的表映射的值对象吗?这似乎有点矫枉过正,但我可以很容易地加入它。我简要地看了一下EntitySet,但我看到的简单例子似乎并不合适。感觉应该有一种优雅的方式来为每个用户获取Forum对象的集合,但我无法想出任何。顺便说一句,我是C#&amp; amp;的新手。 OO。我还应该提一下,由于这些是应用程序的早期阶段,如果有一种我没有看到的更好的方法,我愿意改变实体或表格的结构/关系。
答案 0 :(得分:3)
您应该有另一个Entity类(可能应该是内部的),它反映了数据库中的AllowedForums表。现在我假设您的User表和您的Forums表都与此AllowedForums表具有PK / FK关系。因此,User类上应该有一个如下所示的内部属性:
internal EntitySet<AllowedForums> AllowedForumsRelationships
{
get;set;
}
或类似的东西。这应该在User和Forums类上。您的AllowedForums类将有两个属性。一个用户,一个用于论坛。 (如果您使用LINQ to SQL设计器,所有这一切都将自动发生)。
如果你有这个,如果你想获得一个用户的所有AllowedForums,你可以这样做:
public IList<Forum> AllowedForums
{
get
{
var result = new List<Forum>();
foreach(var relationShip in this.AllowedForumsRelationships)
{
result.Add(relationShip.Forum);
return result;
}
}
}
这是我刚刚提出的一些粗略的代码,我不确定它是100%准确的,但我认为你会明白这一点。基本上你在处理多对多的关系,这总是一种痛苦。
编辑:我刚刚使用这些表格与Northwind数据库混淆了这个想法:
订单 订单详细信息 产品
那里有很多关系:订单可以有多个产品,产品可以属于许多订单。现在说你想获得订单的所有产品:
public partial class Order
{
public IList<Product> Products
{
get
{
var list = new List<Product>();
foreach (var item in this.Order_Details)
{
list.Add(item.Product);
}
return list;
}
}
}
这是有效的,所以它应该适用于你正在谈论的场景。
答案 1 :(得分:0)
类似的东西:
var AllowedForums = from f in ForumsTable
join af in AllowedForumsTable on f.Id equals af.forumid into temp
from aft in temp.DefaultIfEmpty()
where (f.IsGlobal == 1 || aft.userid == 1)
select f;