标签: ef-database-first

即使找到键,实体框架也会插入导航属性行

我正在使用实体框架。我有一个表 Person,它在表 PersonCategory 上有一个外键。Person Id 是一个自动递增的身份 (1,1)。每次我更新人员实体时,实体框架都会为 PersonCategory 表插入一行,即使找到类别也是如此。

我正在使用数据库优先设计。

class Person
{
  public string Name {get;set}
  public PersonCategory {get;set;}
}

class PersonCategory
{
  public int ID {get;set}
  public string Name{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-database-first

3
推荐指数
1
解决办法
6164
查看次数

首先是EF数据库 - 向现有模型添加新模型

所以我有一个数据库,并从中创建了一个模型.一切正常.但现在我想在我的数据库中添加更多表并从中生成模型.

首先是EF数据库可以实现吗?我是否必须重新创建所有模型才能添加新模型?所有表格当然来自同一个数据库.

例如:比方说,我有Table1,Table2Table3.通过DBContextGenerator在VS中使用我从.edmx文件生成模型.所以我有Model1,Model2Model3相应的数据库表,我想添加Table4Model4.

我是否必须重新创建所有内容,或者是否可以以某种方式添加?

asp.net-mvc entity-framework ef-database-first

3
推荐指数
1
解决办法
1860
查看次数

首先在EF数据库中自定义属性

美好的一天!

我使用数据库第一个aproach从数据库创建了一个EF模型,并将自己的几个只读属性添加到EF生成的实体类中,这些实体类不在数据库中.每次我更新我的模型从新表添加数据时,我都会松开创建的属性,所以我必须重新创建它们.

作为数据库中的一个例子,我有属性isFemale,但在我的课堂上我创建了

public string Gender
{
    get
    {
           if(isFemale) return "female";
           else return "male";
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是有没有办法从数据库更新模型,留下我生成的属性?

谢谢!

c# entity-framework ef-database-first

3
推荐指数
1
解决办法
3409
查看次数

LINQ根据属性值过滤列表并过滤属性

NavigationItem有导航属性NavigationItemsPermissions,我有RoleId。作为函数中的输入参数,我List<int> roleIds将拥有类似 {1, 3} 的内容。

我如何完成我的工作并把输入列表中的一些内容LINQ还给我。另外请注意,我只想要输入列表中包含的内容。NavigationItemNavigationItemsPermissions RoleIdNavigationItemsPermissionsRoleId

这就是我被困的地方

public List<NavigationItem> GetNavigationItems(MenuType menuType, List<int> roleIds)
{
    var navigationItems = DbContext.NavigationItems.Where(x => x.MenuTypeId == (int) menuType && !x.IsDeleted && x.NavigationItemsPermissions.Any(r=>r.RoleId **in roleIds**)));       

    return navigationItems;
}
Run Code Online (Sandbox Code Playgroud)

举个更简单的比喻(不是真实数据),如果有一个开发者列表

developers: [
    { name: "Hickory", skills: ["c#", "js", "linq"] }
    { name: "Dickory", skills: ["html", "css", "js"] }
    { name: "Dock", skills: ["html", "c#", "oracle"] }
]
Run Code Online (Sandbox Code Playgroud)

以及给定的技能列表list …

c# linq asp.net-mvc ef-database-first

3
推荐指数
1
解决办法
7962
查看次数

我应该如何为现有数据库表定义复合主键?

我正在开发一个Core MVC项目,该项目从预先存在的数据库中读取数据(无需编写).不幸的是,这个数据库是一团糟,但我不能改变其中的任何东西(即使我可以,我不会用10英尺的杆子触摸它).

数据库的一些相关问题如下:

  • 这些表彼此之间没有任何外键关系,并且包含最好输入子表的数据; 创建数据库的人似乎已经将表用作Excel电子表格.
  • 没有定义主键或外键.
  • 表和列的名称似乎是所包含数据的首字母(对于一个假想的示例,一个人通常将其命名为"Customer"的表将被命名为"dbbc",而不是"Database - Business Customer").
  • 这些表不在"dbo"架构中.

然而,我被迫从这个数据库中读取数据,并且更愿意使用实体框架来执行此操作.

该数据库托管在SQL Server 2008R2中.

通过使用[Table],[Column]和[Key]等属性来使用一个具有映射到实际列名称的适当属性名称的类,我可以使其在我必须使用的其中一个表上没有问题.然而,另一张桌子被证明是一个问题.

此表没有可以被视为主键的单个列,但我发现两列的组合对于每一行都是唯一的,因此它们可以被视为复合主键(即使它们未被定义为这样在数据库中).

我已经定义了一个类如下(我已经更改了名称来隐藏这个数据库的标识,就像我想要的名字和耻辱):

[Table("dbbo", Schema = "schema")]
public class Order
{
    [Key]
    [Column("order", Order = 0)]
    public string OrderNo { get; set; }

    [Key]
    [Column("order_line", Order = 1)]
    public string OrderLineNo { get; set; }

    [Column("qty")]
    public double Quantity { get; set; }

    [Column("pr")]
    public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  • 我已经为构成虚构复合主键的两列添加了[Key]属性.
  • 我已经为[Column]属性的Order属性添加了一个值,因为我读到它是复合键所必需的.
  • 我只映射了我需要使用的列,因为该表的列数比该项目的列数多10倍.

仍然,尝试运行该项目会产生错误:

InvalidOperationException:实体类型"MyProject.Models.Order"需要定义主键.

我还可以添加更多内容以使此表与Entity Framework一起使用吗?

编辑:我发现它可以工作,如果我在上下文的 …

sql-server entity-framework composite-primary-key ef-database-first entity-framework-core

3
推荐指数
1
解决办法
2047
查看次数

将关系添加到ASP.NET Identity(数据库优先)中的ApplicationUser类

我在ASP.NET MVC应用程序中使用ASP.NET Identity(数据库优先)。我按照此处的说明使用数据库优先方法设置ASP.NET Identity。

我的AspNetUsers表与Employee表有关系(Employee表具有UserId外键,AspNetUsers实体具有ICollection<Employee>属性)。

我想将ICollection<Employee>属性添加到ApplicationUser,如下所示:

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ICollection<Employee> Employees { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,会收到以下错误消息:

EntityType'AspNetUserLogins'没有定义键。定义此EntityType的键。AspNetUserLogins:EntityType:EntitySet'AspNetUserLogins'基于类型'AspNetUserLogins',但未定义键。

为什么会收到此错误消息?我该如何解决?

c# asp.net-mvc ef-database-first asp.net-identity-2

3
推荐指数
1
解决办法
2969
查看次数

如何让MVC-mini-profiler在EF 4.1 Database First上运行

为此,花费更多的时间来梳理SO.这是设置

  • MVC 3 App使用Repository模式,在2个数据库中有3个存储库.
  • EF 4.1数据库首先使用DBContext API进行数据库连接.
  • 安装来自nuget的mvc-mini-profiler

这就是我在存储库中创建Db Context的方式

public class TransactionRepository : BaseRepository, ITransactionRepository
{
    AccountingEntities _db = new AccountingEntities();

    // repository methods
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中

public class InvoiceController : BaseController
{
    private ITransactionRepository _txnRepository;

    public InvoiceController()
    {
        _txnRepository = new TransactionRepository();
    }

    public InvoiceController(ITransactionRepository t)
    {
        _txnRepository = t;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我已添加到web.config

  <system.data>
    <DbProviderFactories>
      <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
      <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.8.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
    </DbProviderFactories>
  </system.data>
Run Code Online (Sandbox Code Playgroud)

分析这些连接的后续步骤是什么?慢慢来,因为这是我第一次接触实体框架,所以假设EF连接/上下文细节很少.

entity-framework-4.1 database-first ef-database-first mvc-mini-profiler

2
推荐指数
1
解决办法
1219
查看次数

将实体(和相应的表)添加到EF DB优先模型

我对Entity Framework很陌生:我从数据库优先模型开始,维护一个使用EF和普通旧SQL混合创建的应用程序.

我创建了自己的新的DB-first模型,我很好.今天我老板让我添加一个新实体.缺少外键简化了方案.

我在图中创建了我的新实体(它由我刚创建的复杂实体的三个实例组成)但现在我必须创建一个增量DB脚本来创建新表.我应该这样做,为MySQL和SQL Server,但让我们开始第二.

所以现在我看到我有一个编译问题"没有实体映射Entity",如果我使用"从数据库更新模型"命令,我看不到更改送到DB的选项,但这听起来是正确的,因为单词"from".

好的,我试图从右键菜单中单击"表映射",我找到了将实体映射到表的选项.我打算在"添加表或视图"字段中键入新表名,然后......等待!我只能选择现有的表格

我理解它仅适用于单个表,因此我可以简单地"从模型生成数据库"以获取完整的SQL脚本,找到我想要的表,运行到DB并"从DB更新模型",以便EF看到表格,但是

我想了解如何使用Entity Framework创建增量脚本.这是我的问题.

c# sql-server ef-database-first ef-model-first entity-framework-6.1

2
推荐指数
1
解决办法
2866
查看次数

上下文正在Code First模式中使用,其代码是从EDMX文件生成的

我正在开发一个使用EF 6数据库第一种方法的MVC 5应用程序.现在我希望我的DbContext基于不同的用户访问多个数据库.为此,我在Web.Config文件中生成了一个连接字符串:

string str = u.Users.Where(x => x.UserName == HttpContext.User.Identity.Name).First().ConnStr;
var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");          
ConnectionStringSettings c = new ConnectionStringSettings();    
c.ConnectionString = str;
c.Name = u.Users.Where(x => x.ConnStr == str).First().DbName;
c.ProviderName = "System.Data.SqlClient";
section.ConnectionStrings.Add(c);
configuration.Save();
Run Code Online (Sandbox Code Playgroud)

配置文件中生成的连接字符串是:

<add name="Awais123" connectionString="Data Source=.;Initial Catalog=Awais123;integrated security=True;MultipleActiveResultSets=True"
      providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

我制作EDMX时由EF生成的连接字符串是:

<add name="ABCEntities" connectionString="metadata=res://*/Models.awais.csdl|res://*/Models.awais.ssdl|res://*/Models.awais.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Awais;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
      providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

然后我重载了我的Entities构造函数:

public ABCEntities(string nameorConnString) : base(nameorConnString) {}
Run Code Online (Sandbox Code Playgroud)

默认的构造函数是:

public ABCEntities() : base("name=ABCEntities") {}
Run Code Online (Sandbox Code Playgroud)

现在我在另一个.cs文件中声明另一个DbContext类来生成数据库:

public partial class NewDbGen : DbContext
{ …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework ef-code-first ef-database-first

2
推荐指数
1
解决办法
6057
查看次数

Scaffold-DbContext(EF核心工具)引发“实例故障”异常

语境

当前,我正在使用.NET Core创建用C#编写的提取,转换和加载(ETL)应用程序。ETL应用程序的目标是通过Entity Framework Core 2.1.0和更高版本2.1.1访问的数据库。由于模式是固定的,因此使用数据库优先方法。Microsoft提供了以下指南来解决这种情况。该指南指出,Scaffold-DbContextPackage Manager控制台中的CLI命令可用于生成DbContext和相应的实体模型。

在此项目的早期,我已经成功使用了此CLI命令。但是,模型的命名并不直接对应于表名和列名。此CLI工具的较新版本提供了一个option -UseDatabaseNames,因此我选择重新运行此命令以生成一些更新的模型。另外,我计划在将来重新生成DbContext。

问题

不幸的是,运行Scaffold-DbContext命令现在返回以下错误:Instance failure.。详细选项使您可以更深入地了解出了什么问题,但是我不清楚到底出了什么问题以及如何解决。

命令

Scaffold-DbContext "[ConnectionString]" Microsoft.EntityFrameworkCore.SqlServer -UseDatabaseNames -OutputDir Models -v -force
Run Code Online (Sandbox Code Playgroud)

详细输出

Using project '[ProjectName]'.
Using startup project '[ProjectName]'.
Build started...
Build succeeded.
C:\Program Files\dotnet\dotnet.exe exec --depsfile C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.deps.json --additionalprobingpath C:\Users\[MyComputerUsername]\.nuget\packages --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.runtimeconfig.json C:\Users\[MyComputerUsername]\.nuget\packages\microsoft.entityframeworkcore.tools\2.1.1\tools\netcoreapp2.0\any\ef.dll dbcontext scaffold Server=[ConnectionString] Microsoft.EntityFrameworkCore.SqlServer --json --output-dir Models --use-database-names --force --verbose --no-color --prefix-output --assembly C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.dll --startup-assembly C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.dll --project-dir C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\ --language C# --working-dir C:\Repos\[Client]\[ProjectName]\[ProjectName] --root-namespace [ProjectName].Service
Using …
Run Code Online (Sandbox Code Playgroud)

ef-database-first .net-core entity-framework-core-migrations entity-framework-core-2.1 ef-core-2.1

2
推荐指数
3
解决办法
4301
查看次数