DataContext选择不存在的字段

时间:2015-08-07 11:15:19

标签: c# database datacontext

我收到错误

  

{“无效的列名'Role_Id'。\ r \ n无效的列名'User_Id'。”}

当我尝试获得这样的所有权限时:

public IEnumerable<Permission> GetAllPermissions()
{
        return base.DataContext.Permissions;
}

这些“Role_id”和“User_id”是什么?它们在我的模型和数据库中都不存在......它是什么意思?在我的整个解决方案中,我没有像“Role_id”和“User_id”那样的东西

这是来自DataContext的查询(那些是“Role_id”和“User_id”......):

{SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[Role_Id] AS [Role_Id], 
[Extent1].[User_Id] AS [User_Id]
FROM [dbo].[Permissions] AS [Extent1]}

权限模型如下:

public class Permission : INotifyPropertyChanged
{
    private string name;

    public int Id
    {
        get;
        set;
    }


    public string Name
    {
        get
        {
            return this.name;
        }
        set
        {
            this.name = value;
            this.OnPropertyChanged("Name");
        }
    }

    public Permission()
    {

    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler propertyChangedEventHandler = this.PropertyChanged;
        if (propertyChangedEventHandler != null)
        {
            propertyChangedEventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

数据库中的表:

enter image description here

上下文:

    public class MyContext : DbContext
{
    public DbSet<User> Users { get; set;}
    public DbSet<Role> Roles { get; set;}
    public DbSet<RolePermission> RolePermissions { get; set;}
    public DbSet<Permission> Permissions { get; set;}
    ...
    public MyContext()
        : base("name=my_Connection")
    {
        System.Data.Entity.Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());
    }
}

1 个答案:

答案 0 :(得分:1)

好的,所以只是想确保你没有先使用Model来从类生成数据库。 autogenerated names来自EF使用的约定。它只是跟踪数据库的基本convention,例如模式NameOfNavigationProperty_NameOfRelatedPK

在你的情况下,EF试图通过引用发现外键,这就是你获得生成值的原因。可以通过DBModelBuilder禁用此约定。 在DbContext中,您可以应用以下覆盖并禁用名为NavigationPropertyNameForeignKeyDiscoveryConvention

的约定
public class SampleContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Permission> Permissions { get; set; }
    // ... goes other properties

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
    }
}

注意: 确保彻底测试您的应用程序。此修复程序不保证这不会影响其他现有查询。