电子邮件+

时间:2015-11-22 18:10:40

标签: entity-framework entity-framework-6

我有一个名为User的父类和两个继承自User类的子类。

我想确保电子邮件始终是唯一的。通过添加添加:

[Index(IsUnique=true)]

我可以阻止电子邮件被多次使用。 但是,在我的情况下,我希望能够为访客和帐户所有者表使用相同的电子邮件(用户可以同时拥有帐户所有者和访客帐户。

最佳解决方案是什么?是否可以从用户移动Email属性,而是在Account Owner和Guest类中使用两个属性? EF是否了解它的两种不同类型呢?

作为旁注,在我的OnModelCreating函数中,我添加了:

        modelBuilder.Entity<AccountOwner>().ToTable("AccountOwners");
        modelBuilder.Entity<Guest>().ToTable("Guests");

因此,帐户所有者和访客获取了自己的表,这意味着我可以从User,AccountOwner和Guest表中查询用户。

家长 - 用户

public class User
{
    public User()
    {
    }

    [Key]
    public int UserID { get; set; }

    [Required]
    [StringLength(150)]
    [Column(TypeName = "VARCHAR")]
    public string Email { get; set; }
}

儿童 - 帐户所有者

public class AccountOwner : User
{
    public AccountOwner()
    {
    }
}

儿童 - 访客

public class Guest : User
{
    public Guest()
    {
    }
}

如何对电子邮件和类型进行组合的IsUnique约束?

hi@gmail.com - 帐户所有者

hi@gmail.com - 访客

应该被允许。

修改

public class AccountLink
    {
        [Key, Column(Order = 0)]
        public int AccountOwnerID { get; set; }
        [Key, Column(Order = 1)]
        public int GuestID { get; set; }

        public DateTime DateCreated { get; set; }
        public DateTime DateStart { get; set; }
        public DateTime DateExpires { get; set; }

        [ForeignKey("AccountOwnerID")]
        public virtual AccountOwner AccountOwner { get; set; }
        [ForeignKey("GuestID")]
        public virtual Guest Guest { get; set; }

        public virtual ICollection<AccountLinkPermission> AccountLinkPermissions { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

使用TPH(每个层次结构表)ORM模式,这是具有基类User和派生类(如GuestAccountOwner)时的默认模式。

删除您将OnModelCreatingGuest映射到他们自己的表的AccountOwner中的代码。

请勿忘记User课程为abstract,以防止创建User个实例,因为用户为GuestAccountOwner

public abstract class User
{
    // ...
}

像这样实施OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().ToTable("User")
        .Map<Guest>(m => m.Requires("AccountType ").HasValue("Guest"))
        .Map<AccountOwner>(m => m.Requires("AccountType ").HasValue("AccountOwner"));
}

为您的上下文调用Enable-Migrations,然后针对相同的上下文调用Add-Migration Init。然后在生成的代码*_Init中添加以下行:

.Index(t => new { t.Email, t.AccountType }, unique: true, name: "IX_EMAIL_ACCOUNTTYPE")

在创建User表的语句的末尾。你必须有这样的东西:

CreateTable(
    "dbo.User",
    c => new
        {
            UserId = c.Int(nullable: false, identity: true),
            Email = c.String(nullable: false, maxLength: 150, unicode: false),
            AccountType = c.String(nullable: false, maxLength: 128),
        })
    .PrimaryKey(t => t.UserId)
    .Index(t => new { t.Email, t.AccountType }, unique: true, name: "IX_EMAIL_ACCOUNTTYPE");

这就是你所要做的一切。