我有这些实体:
public class User {
public string Username { get; set; }
// OtherProperties
}
public class Page {
public string Username { get; set; }
// OtherProperties
}
OtherProperties
在每个实体与另一个实体完全不同。但是,Username
s应该是唯一的,无论它们属于何处。我的意思是,如果User
有Username = a
,则其他User
或Page
都不能拥有此Username
。你会怎么处理这个?拥有第3个实体是个好主意,例如
class Username { string Name { get; set; } }
考虑到这个事实,它只是一个简单的单一属性?
更新:更多解释:
User
是与Page
完全独立的不同实体。但是它们都有一个名为Username
的属性,它在整个应用程序中应该是唯一的。
答案 0 :(得分:1)
是的,你的方法很好。创建第三个类Username
并在前两个类中添加它的属性。喜欢这个
class UserName
{
string Name { get; set; }
}
public class User
{
public Username UName { get; set; }
// OtherProperties
}
public class Page
{
public UserName UName { get; set; }
// OtherProperties
}
更改了属性名称,因为类名称和属性名称相同。你可以拥有最适合你的东西。
回到问题。
此外,如果您想添加有关用户名的任何其他详细信息,那么您必须在UserName
中添加一个属性,并且您在用户和页面中的代码不需要任何更改。
答案 1 :(得分:0)
如果你想在许多类中拥有唯一的用户名,那么你应该实现具有唯一用户名的第3个表,它将被FKyed到包含username属性(列)的所有表。对于此任务,您可以使用类属性或FluentAPI。正如我的经验告诉我的那样,最好使用FluentAPI作为属性方法并不总能提供预期的结果。
例如像这样的smth:
public class Username
{
[Index(IsUnique = true)]
public int Id {get;set;}
[Index(IsUnique = true)]
public string Name {get;set;}
public virtual ICollection<Page> PagesList{ get; set; }
}
public class Page {
public int UsernameId { get; set; }
// OtherProperties
public virtual string Username {get;set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//one-to-many
modelBuilder.Entity<Page>().HasRequired<Username>(s => s.Username)
.WithMany(s => s.PagesList)
.WillCascadeOnDelete(true);
}
有关FluentAPI唯一键的更多详细信息:Unique keys in Entity Framework 4
有关实施FK的更多详情:http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx