具有TPH鉴别器列的表上的简单成员资格

时间:2013-01-30 15:50:47

标签: c# asp.net-mvc inheritance asp.net-mvc-4 simplemembership

我有一个带有Person对象的类库,它还有两个继承自它的其他类型。我最初使用它来扩展一个人的aspnetdb属性,但后来遇到了SimpleMembership安全性,并一直试图让它工作。

{
    public abstract class Person
    {
        [Key]
        public int Id { get; set; }
        /// <summary>
        /// eg. AB123
        /// </summary>
        public string Uid { get; set; }
        public bool? IsRepresrentative { get; set; }
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Display(Name = "Preferred First Name")]
        public string FirstNamePreferred { get; set; }
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Display(Name = "Full Name")]
        public string FullName { get; set; }
        public string Email { get; set; }
        public string EmailAdditional { get; set; }
        public string Telephone { get; set; }
        [Display(Name = "Job Title")]
        public string JobTitle { get; set; }
        public string PersonalPage { get; set; }
        public string ServiceArea { get; set; }

        //Profile items
        public int? PrefNewsItemsToShow { get; set; }

        public override string ToString()
        {
            return FullName ??
                   string.Format("{0} {1}", string.IsNullOrEmpty(FirstNamePreferred) ? FirstName : FirstNamePreferred, LastName);
        }
    }

    public class ProviderUser : Person
    {
        public ICollection<Provider> Providers { get; set; }
    }

    public class SchoolUser : Person
    {
        public ICollection<School> Schools { get; set; }
    }

}

我在InitializeSimpleMembershipAttribute.cs

中有以下设置
WebSecurity.InitializeDatabaseConnection("MyCommonContext", "People", "Id", "Uid", autoCreateTables: true);

这似乎有效,如果我没有在带有鉴别器的桌子上。但我认为以上是这个想法,所以你可以使用包含其他数据的表格。

有两种方式可以查看我的问题。 1.当我尝试从AccountController创建用户时,我在上面的设置中得到以下内容:

Cannot insert the value NULL into column 'Discriminator', table 'dbo.People'; column does not allow nulls. INSERT fails.

我该如何解决?

  1. 另一种看待它的方式是,我怎样才能以不同/更好的方式做我想做的事情?

3 个答案:

答案 0 :(得分:1)

这是很久以前的事了,但我刚遇到这个问题,我有一个解决方案,即使我讨厌它。为什么它不起作用是迟钝的。

您仍然可以使用WebSecurity.CreateUserAndAccount(model.UserName,model.Password),但可以自行添加Discrimator。

WebSecurity.CreateUserAndAccount(model.UserName,model.Password,new {Discrimator =“Person”});

答案 1 :(得分:0)

j_walker_dev说什么工作正常,但是,我不确定它是多么正确。

除此之外,如果您使用它;然后你可以使用&#34; is&#34;来检索这些类型。关键字。

e.g。

var people = (from p in context.UserProfiles where p is Person select p).ToList();

EF根据鉴别器名称知道哪些用户属于Person类型。

可爱的东西。

答案 2 :(得分:-1)

我遇到同样的问题&amp;我这样解决:

  

请使用WebSecurity.CreateAccount代替   WebSecurity.CreateUserAndAccount(model.UserName,model.Password);

像这样:

我个案中的人不是抽象的。

Person p = new Person();
p.UserName = model.UserName;
((PeronRepository)repository).Add(p);
((PerssonRepository)repository).Save(p);
WebSecurity.CreateAccount(model.UserName, model.Password);

由于 Fawzy Malash