将用户的ID存储在表中以创建所有权是错误的吗?

时间:2014-12-22 22:09:23

标签: c# sql-server asp.net-mvc entity-framework

我有一个简单的事件模型,需要由一次使用拥有。我想要做的只是将用户的ID作为外键存储在事件表中。然后,在查找时,我将查询该用户拥有的所有事件。简单的东西。

问题在于我是ASP.NET MVC和实体框架的新手,因此,它似乎并不那么容易。或者更确切地说,似乎有一种更开明的方式来做事情,因为我试图将信息拼凑在一起,我认为这超出了我目前的技能水平。

如果我选择轻松的话,我会不会在脚下拍摄?#34;方式只是将用户的ID存储为字符串?如果是这样,我真的很感激地向我指出一些描述这个概念以及如何做的推荐文章或视频。

1 个答案:

答案 0 :(得分:3)

我认为你的问题很模糊,但我也认为我明白你在问什么。您似乎在询问是否应该创建用户表和事件表之间的关系,或者只是将用户ID存储在没有关系的事件表中。

在短时间内,是的,你将会在脚下射击自己"以多种方式。首先,在相关实体之间使用外键可以在数据库中实现完整性。这意味着您无法将事件与不存在的用户联系起来。其次,SQL使用这些外键来更好地索引和查询表。最后,您失去了实体框架的许多功能,例如能够执行以下操作:

var user = db.Users.First(x=>x.Id == userId);
var userName = user.Name;
var events = user.Events.ToList();

在这个例子中,我只需要引用一次DataContext,但是,可以访问该对象的任何属性或相关实体。当然,这有两种方式。

var event = db.Events.First(x=>x.Id == eventId);
var eventOwner = event.User;

话虽如此,this article should give you some really good guidance on doing relationships and code first。使用您的示例,它应该像以下一样简单:

public partial class User{
   public User(){       
       this.Events = new HashSet<Event>();
   }

   public Guid UserId {get;set;}
   public string Name {get;set;}
   //...other properties as needed
   public virtual ICollection<Event> Events {get;set;}
}

public partial class Event{
   public int EventId {get;set;}
   public Guid UserId {get;set;}
   //...other properties
   public virtual User User {get;set;}
}

至于将某些内容存储为实际为GUID的字符串,外键将不允许您映射到不同数据类型的列。要么它们都需要是varchar,要么两者都需要是Guid(SQL中的uniqueidentifier)。保持GUID,比随机字符集更好地建立索引。