我们对此项目的数据库使用实体框架代码优先。最佳代码中心ID表第一种方法
我们的需求需要一个中心的'资源'表,带有一列ResourceId(uniqueidentifier NOT NULL DEFAULT(newsequentialid()))。 各种表格将使用此表作为其ID。
简介 - 简档(唯一标识符NOT NULL) 组织 - OrganizationId(唯一标识符NOT NULL) 文件= DocumentId(唯一标识符NOT NULL)
所以,如果我创建一个新的档案记录,我将创建一个新的资源记录并使用该顺序创建的Guid作为新配置文件记录的ID。
原因是为了防止配置文件中的Id始终作为组织的Id存在。 (我知道,这是最有可能不可能的,但并非不可能。)
现在我们有关系,定义这个是这样的:
public class Resource : BaseEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid ResourceId { get; set; }
public virtual Profile Profile_ProfileId { get; set; }
//...
}
public class Profile : BaseEntity, IAuditableEntity
{
[Key]
public Guid ProfileId { get; set; }
public virtual Resource Resource { get; set; }
//...
}
public class ProfileMapping : EntityTypeConfiguration<Profile>
{
public ProfileMapping()
{
//Primary key
HasKey(t => t.ProfileId);
//Constraints
Property(t => t.ProfileId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
//...
ToTable("Profile");
//Create Relation
HasRequired(t => t.Resource).WithOptional(t => t.Profile_ProfileId);
}
}
然后,当我们创建一个新的配置文件,我们这样做(DB是我们的DbContext的实例):
var res = new Resource();
db.Resource.Add(res);
var newProfile = new Profile{
ProfileId = res.ResourceId,
IsActive = true
};
db.Profile.Add(newProfile);
不过,我想,我们可以定义我们的类/型号可供资源继承和获得更好的效果?
有没有人用过这样的数据库结构?
如果这只是为了防止重复的主键值这是一个**绝对没用**矫枉过正。 GUID是[非常](http://stackoverflow.com/q/184869/861716)[不太可能](http://stackoverflow.com/q/3138395/861716)被复制。这将是一个没有任何*好处的持续负担。 –
也许是这样,不是我的电话。 :( –