如何处理具有一个“唯一”属性的两个实体?

时间:2014-07-14 06:07:18

标签: c# entity-framework c#-4.0 domain-driven-design entity-framework-6

我有这些实体:

public class User {
    public string Username { get; set; }
    // OtherProperties
}

public class Page {
    public string Username { get; set; }
    // OtherProperties
}

OtherProperties在每个实体与另一个实体完全不同。但是,Username s应该是唯一的,无论它们属于何处。我的意思是,如果UserUsername = a,则其他UserPage都不能拥有此Username。你会怎么处理这个?拥有第3个实体是个好主意,例如

class Username { string Name { get; set; } }

考虑到这个事实,它只是一个简单的单一属性?

更新:更多解释:

User是与Page完全独立的不同实体。但是它们都有一个名为Username的属性,它在整个应用程序中应该是唯一的。

2 个答案:

答案 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