实体框架代码优先 - 忽略基类

Mar*_*ark 7 asp.net ef-code-first c#-4.0 entity-framework-4.1

我有一个模型如下:

public class User : System.Web.Security.MembershipUser
{
public int UserId { get; set; }
    public string SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

生成数据库时,我希望实体框架忽略MembershipUser,只生成一个名为User的表,其中包含User类中的两个属性.我试过以下无济于事.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Ignore<System.Web.Security.MembershipUser>();
}
Run Code Online (Sandbox Code Playgroud)

Era*_*nga 8

有两种选择.一种是通过调用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
}
Run Code Online (Sandbox Code Playgroud)

其他选项是使用合成来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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并映射如下

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

}
Run Code Online (Sandbox Code Playgroud)


Shi*_*mmy 3

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定代码是否首先自行自动处理元数据,请尝试上述方法,如果不起作用,请手动附加元数据(即取消注释注释行)。

更新 我确实更喜欢上面的解决方案,但如果它对您来说太冗长,请使用以下StructuralTypeConfiguration<TStructuralType>.Ignore<TProperty> Method方法:

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