有人可以建议针对C#限制的解决方法吗?我需要两种不同的类型来源于相同的基类型。在我的例子中,员工和用户是人。员工也可以是用户(反之亦然)。这似乎是多重继承,C#不支持。我查看了http://www.codeproject.com/KB/architecture/smip.aspx,这似乎不符合我的情况。
public abstract class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public class Employee : Person
{
public string Number { get; set; }
public System.DateTime HireDate { get; set; }
}
public class User : Person
{
public string Password { get; set; }
public bool Active { get; set; }
}
public class CfTestContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Entity<Person>().ToTable("People");
modelBuilder.Entity<Employee>().ToTable("Employees");
modelBuilder.Entity<User>().ToTable("Users");
}
}
public class CreateCfTestDatabase : DropCreateDatabaseAlways<CfTestContext>
{
protected override void Seed(CfTestContext context)
{
// Abraham Lincoln hired as an Employee on February 12th.
// Abraham doesn't need access as a User because he doesn't use the Purchasing application.
context.Employees.Add(new Employee { Name = "Abraham Lincoln", Email = "abraham@microsoft.com", Number = "107124", HireDate = System.DateTime.Parse("2/12/2000") });
// George Washington added as a User on July 4th.
// George is a consultant, so he will never become an Employee.
context.Users.Add(new User { Name = "George Washington", Email = "george@microsoft.com", Password = "xT76#a2", Active = true });
context.SaveChanges();
// Make Abraham Lincoln a User on September 29th.
// Abraham received training and now needs to use the Purchasing application
Employee employee = context.Employees.Where(t => t.Name == "Abraham Lincoln").FirstOrDefault();
context.Users.Add(new User { Password = "C1x$av38", Active = true, ID = employee.ID }); // this does not produce the desired results.
context.SaveChanges();
base.Seed(context);
}
}
答案 0 :(得分:1)
你是对的,不可能在C#中创建多个继承对象。但是您可以通过在模型中创建ComplexType(例如Login)来解决此问题,并添加Password和Active属性,将Login属性添加到person对象。然后,您可以通过检查Person对象上的Login.Active来检查用户是否具有活动的登录信息。