我收到错误
{“无效的列名'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;
}
数据库中的表:
上下文:
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>());
}
}
答案 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>();
}
}
注意: 确保彻底测试您的应用程序。此修复程序不保证这不会影响其他现有查询。