Asp.net

實體框架程式碼優先 - 忽略基類

  • January 18, 2012

我有一個模型如下:

public class User : System.Web.Security.MembershipUser
{
public int UserId { get; set; }
   public string SomeProperty { get; set; }
}

當我的數據庫生成時,我希望實體框架忽略 MembershipUser 並只生成一個名為 User 的表,其中包含來自 User 類的兩個屬性。我試過以下無濟於事。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Ignore<System.Web.Security.MembershipUser>();
}

NotMappedAttribute屬性是你的朋友:

[MetadataType(typeof(UserMd)]
public class User : System.Web.Security.MembershipUser
{
   ////read description bellow code
   //static User()
   //{
   //  var type = typeof(User);
   //  TypeDescriptor.AddProviderTransparent(
   //    new AssociatedMetadataTypeTypeDescriptionProvider(type), type);
   //}        

   public int UserId { get; set; }
   public string SomeProperty { get; set; }

   internal class UserMd
   {
       [NotMapped]
       public string UserName { get; set; }
   }
}

我不確定程式碼是否首先自動處理元數據,請嘗試上述方法,如果不起作用,請手動附加元數據(即取消註釋註釋行)。

更新 我確實更喜歡上述解決方案,但如果它對您來說太冗長,請使用以下StructuralTypeConfiguration<TStructuralType>.Ignore<TProperty> Method方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   var config = modelBuilder.Entity<User>();
   config.Ignore(u => u.UserName);
}

您有兩種選擇。一種是通過呼叫Ignore每個屬性來忽略所有基類屬性。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<User>().Ignore(u => u.ProviderUserKey);
   modelBuilder.Entity<User>().Ignore(u => u.LastActivityDate);
   // and so on for all base class properties
}

其他選擇是使用組合從您的類中檢索MembershipUser實例。User這裡的User不是繼承MembershipUser.

public class User
{
   public int UserId { get; set; }
   public string SomeProperty { get; set; }

   public MembershipUser MembershipUser
   {
       get
       {
           // create an instance using the available properties and return
       }
   }
}

並映射如下

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<User>().Ignore(u => u.MembershipUser);
   modelBuilder.Ignore<System.Web.Security.MembershipUser>();

}

引用自:https://stackoverflow.com/questions/8904550