鉴别器列其实就是相当于类的全类型名称
鉴别器列必须位于父类,而且父类不能是抽象类
看以下的例子:
User表结构
ID Name UserType Publisher Author Type
数据值 CUser
- [Table(Name="User")]
- [InheritanceMapping(Code = "Unknown", Type = typeof(BaseUser), IsDefault = true)]
- [InheritanceMapping(Code = "CUser", Type = typeof(CUser))]
- public class BaseUser : IEntity
- {
- private System.Guid _ID;
- [Column(Storage = "_ID", Name = "ID", DbType = "UniqueIdentifier NOT NULL",
- IsPrimaryKey = true, CanBeNull = false)]
- public System.Guid ID
- {
- get { return _ID; }
- set { _ID = value; }
- }
- [Column]
- public string Name
- {
- get;
- set;
- }
- /// <summary>
- /// 鉴别器
- /// </summary>
- [Column(IsDiscriminator = true, AutoSync = AutoSync.Never)]
- public string Type { get; set; }
- public class CUser : BaseUser
- {
- [Column]
- public char UserType
- {
- get;
- set;
- }
- [Column(Name = "Publisher")]
- public Guid PublisherID
- {
- get;
- set;
- }
- [Column(Name = "Author")]
- public Guid AuthorID
- {
- get;
- set;
- }
- }
可以看到 UserDataControl 数据控制类的部分代码
如果Type的值为空,以下代码返回值为 null,因此鉴别列非常重要,因为内核代码是通过鉴别列的值来确定返回什么类型的子类
- var query = from user in theDataContext.GetTable<BaseUser>()
- where user.ID == objIEntity.ID
- select user as CUser;
- public override IEntity SelectByPK(Guid Key)
- {
- try
- {
- CUser objCUser = new CUser();
- var query = from user in theDataContext.GetTable<BaseUser>()
- where user.ID == Key
- select new
- {
- ID = user.ID,
- UserType = ((CUser)user).UserType,
- Name = user.Name,
- PublisherID = ((CUser)user).PublisherID,
- AuthorID = ((CUser)user).AuthorID,
- Type = "CUser"
- };
- foreach (var each in query)
- {
- objCUser.ID = each.ID;
- objCUser.Name = each.Name;
- objCUser.UserType = each.UserType;
- objCUser.PublisherID = each.PublisherID;
- objCUser.AuthorID = each.AuthorID;
- objCUser.Type = each.Type;
- }
- return objCUser;
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- public override void Update(IEntity entity)
- {
- try
- {
- CUser objIEntity = entity as CUser;
- //注意:鉴别器的值不能为空,否则查询出来的为NUll
- var query = from user in theDataContext.GetTable<BaseUser>()
- where user.ID == objIEntity.ID
- select user as CUser;
- foreach (var each in query)
- {
- each.Name = objIEntity.Name;
- }
- theDataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
- }
- catch (ChangeConflictException)
- {
- theDataContext.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);
- theDataContext.SubmitChanges();
- }
- }