【问题标题】:How to handle two entities with one “unique” property?如何处理具有一个“独特”属性的两个实体?
【发布时间】:2014-07-14 06:07:17
【问题描述】:

我有这些实体:

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

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

OtherProperties 在每个实体中都与另一个完全不同。但是,Usernames 应该是唯一的,无论它们属于哪里。我的意思是如果有一个UserUsername = a,其他Users 或Pages 都不能有这个Username。你会怎么处理这个?拥有第三个实体是个好主意吗?一个

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

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

更新:更多解释:

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

【问题讨论】:

  • 你的方法会很好。
  • @NikhilAgrawal 什么方法?创建第三堂课?
  • @NikhilAgrawal 你会发表你的评论作为答案吗?所以我可以 +1 或者可能会接受。

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


【解决方案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 中添加一个属性,并且您在用户和页面中的代码不需要任何更改。

【讨论】:

    【解决方案2】:

    如果你想在许多类中拥有唯一的用户名,那么你应该使用唯一的用户名实现第三个表,它将被 FKyed 到所有包含用户名属性(列)的表。对于此任务,您可以使用类属性或 FluentAPI。根据我的经验,最好使用 FluentAPI 作为属性方法,但并不总是能提供预期的结果。

    例如这样的:

    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

    【讨论】:

    • 不,我不是这个意思。 User 是与 Page 完全不同的实体。但是它们都有一个名为Username 的属性,它在整个应用程序中应该是唯一的。
    • 那么你应该做第三张桌子,这对他们来说都是通用的。
    • 好的。我也更新了问题。如果您认为我应该这样做,请将其发布为您的答案 - 或更新当前答案 - 这样我就可以 +1。其他建议我会等一会,我会接受最好的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2015-05-30
    相关资源
    最近更新 更多