我有一个名为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()
{
}
}
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; }
}
答案 0 :(得分:0)
使用TPH(每个层次结构表)ORM模式,这是具有基类User
和派生类(如Guest
和AccountOwner
)时的默认模式。
删除您将OnModelCreating
和Guest
映射到他们自己的表的AccountOwner
中的代码。
请勿忘记User
课程为abstract
,以防止创建User
个实例,因为用户为Guest
或AccountOwner
。
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");
这就是你所要做的一切。