我使用 EF Core,在我的dbcontext类中,我重写了将onModelCreating类中的一个属性配置为在 SQL Server 中自动递增的方法。
这是我的DbContext课:
public class AppDbContext:IdentityDbContext<AppUser>
{
public AppDbContext(DbContextOptions options) : base(options)
{
}
public AppDbContext()
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Service>()
.Property(service => service.ID)
.UseIdentityColumn(1, 1);
}
public virtual DbSet<AppUser> AppUsers { get; set; }
public virtual DbSet<Service> Services { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您注意到我的DbContext类继承自IdentityDbContext,因为我使用了身份。
问题:我收到此错误:
CS0121
以下方法或属性之间的调用不明确:“Microsoft.EntityFrameworkCore.OraclePropertyBuilderExtensions.UseIdentityColumn(Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder, int, int)”和“Microsoft.EntityFrameworkCore.SqlServerPropertyBuilderExtensions.UseIdentityColumn(Microsoft.EntityFrameworkCore. Metadata.Builders.PropertyBuilder,int,int)'
附加信息
我在我的解决方案中引用了另一个项目,这个项目将扮演存储库的角色,他准备与SQL Server、Oracle和MySQL一起工作。
我依赖的项目是我自己的项目,而且是开源的就是仓库链接
请帮忙解决这个问题吗?
我正在编写一个 .NET 6 控制台应用程序,下面有未完成的代码。我不知道如何从配置中获取连接字符串,以便将其传递给该options.UseSqlServer方法。
我更喜欢使用顶级报表模板。
另外,我应该hostBuilder.Build().Run();在这段代码的末尾调用吗?要不就hostBuilder.Build()?只是想知道有什么区别。
var hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
builder.SetBasePath(Directory.GetCurrentDirectory());
})
.ConfigureServices((context, services) =>
{
services.AddDbContext<CompanyContext>(options => options.UseSqlServer("<connection string from config"));
});
Run Code Online (Sandbox Code Playgroud) console-application dbcontext entity-framework-core .net-6.0
所以,我已经按照ADO.NET团队博客的指示尝试制作一个小型测试项目.我仔细检查了一切.它似乎不起作用,并一直说连接字符串丢失.
http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx
步.1构建此UserModels.dll.在dll,App.Config文件中,edmx生成了这个连接字符串:(在创建它时点击'test'按钮,它成功连接,并从'UserDatabase'生成所有表的edmx图)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="UserModelsContainer" connectionString="metadata=res://*/UserModels.csdl|res://*/UserModels.ssdl|res://*/UserModels.msl;provider=System.Data.SqlClient;provider connection string="data source=MyDesktop\SQL2008;initial catalog=UserDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
第2步然后我做了一个测试项目:
class UnitTetst1 ....
TestMethod1()....
using (var db = new UserModelsContainer()) {
int i = db.Users.Count(); // <---expecting '0' for a new db, but I get an exception
}
Run Code Online (Sandbox Code Playgroud)
---------问题在这里-----------------
步骤3.运行测试.然后我得到一个错误InvalidOperationException像这样:
"No connection string named 'UserModelsContainer' could be found in the application config file."
Run Code Online (Sandbox Code Playgroud)
好像DbContext不知道在哪里从App.Config中取出connectionStrings?
请帮帮忙~~
我正在使用EF5.我想初始化DbContext中包含的DbSet集合的每个对象,最好(但不一定)在对象字段(但不一定是与其他POCO的关系)之后初始化.这可能缩短为"施工后拦截"或"后加载拦截".
初始化需要使用与DbContext实例并行的对象实例(当前用户设置等)设置对象的某些属性.
所以基本上:
var settings = new Settings();
settings.PrintName = false;
var context = new MyDbContext();
// here initialize context so that every User object get initialized with settings
var john = context.Users.Where(x => x.Name == "John").FirstOrDefault();
Assert.AreEqual(john.Settings, settings);
Run Code Online (Sandbox Code Playgroud)
除了循环遍历集合中的所有对象并手动设置属性之外,实现此目的的可能方法是什么?
我想在创建任何实体时运行一些代码.一直在DbContext中查找要覆盖的内容,但在查找有用的内容时遇到一些困难.
为了解释一下......我有几个模型,当我使用其中一个模型在实体中返回数据时,我希望能够在返回到调用方法之前对实体做一些事情.我想最多为每个模型定义一次这个代码,我想让它发生在所有实体上.
那里有EF专家吗?
谢谢
我正在使用Entity Framework 6开发Web API。我必须执行一个复杂的SQL查询,该查询从多个表中获取数据,如代码所示。我已经尝试过,但是出现以下错误:
数据读取器具有多个字段。多个字段对于EDM原语或枚举类型无效。
该查询在SSMS查询分析器中成功返回了数据。
[HttpGet]
public IHttpActionResult getJobNo(string cmpCode, string branchCode)
{
string query = string.Format(
@"select
M.S1, M.S2, C.S2 As S30, M.S3, SC.S2 As S31, M.D1, M.S5,
JT.S2 As S32, M.S6, TM.S2 As S33, M.S10
from
MERTRM M, CMF C, CMFS SC, PMCD JT, PMCD TM
where
M.S100 = 'JOB' and M.S102 = '{0}' and
M.S108 = '{1}' and
M.S101 not in('U', 'C', 'F') and
M.S2 = C.S1 and C.S102 = '{0}' and
C.S100 = 'CC' and …Run Code Online (Sandbox Code Playgroud) 我想使用简单的LINQ命令从我的表"Header"中选择数据,但我遇到了错误.
我的行动
public HeaderModel GetHeaderInformation()
{
using(var context = new ApplicationDbContext())
{
var header = context.Headers.Select(x => new HeaderModel
{
colorCode = x.colorCode,
height = x.height,
Id = x.Id,
left = x.left,
top = x.top,
width = x.width
}).FirstOrDefault();
return header;
}
}
Run Code Online (Sandbox Code Playgroud)
错误
附加信息:尚未为此DbContext配置数据库提供程序.可以通过覆盖DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序.如果使用AddDbContext,那么还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基础构造函数.
我的ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public ApplicationDbContext() : base() { }
public DbSet<Header> Headers { get; set; }
public DbSet<Menu> Menus { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 我想对单词列表执行查询.
string[] words = {"word1", "word2", "word3"}
在我的数据库中,我有一个包含艺术家和标题的曲目列表.我想用OrWhere条件连接所有查询.这就是我现在所拥有的:
var word;
var queryTracks;
for (int i = 0; i < words.Length; i++)
{
word = words[i];
queryTracks = db.Tracks.Where(c => c.Title.Contains(word) || c.Artist.Contains(word));
}
// all found, put all that into a list
var filteredTracks = queryTracks.ToList();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这样的.Concat()方法:
var word = words[0];
var queryTracks = db.Tracks.Where(c => c.Title.Contains(word) || c.Artist.Contains(word));;
for (int i = 1; i < words.Length; i++)
{
word = words[i];
queryTracks = queryTracks.Concat(db.Tracks.Where(c => c.Title.Contains(word) || …Run Code Online (Sandbox Code Playgroud) 我正在尝试为服务层编写单元测试(使用NUnit),该服务层使用:
我还使用Effort.EF6在单元测试中模拟DbContext.不幸的是,我找不到让DbContextScope与Effort兼容的方法,以便我可以正确测试所有案例.
代码概述
服务层由执行某些业务逻辑的类(服务)组成.每个方法都被视为一个完整的事务,以context.SaveChanges().结尾.例:
private IDbContextScopeFactory _dbContextScopeFactory;
public DepartmentsService(IDbContextScopeFactory dbContextScopeFactory)
{
_dbContextScopeFactory = dbContextScopeFactory;
}
public BusinessModel.Department Insert(BusinessModel.Department department)
{
using (var dbContextScope = _dbContextScopeFactory.Create())
{
// Validation
ValidateAndThrowOnFailure(department, new DepartmentAddValidator());
// Operation
DBModel.Department newDepartment = Mapper.Map<DBModel.Department>(department);
newDepartment.InsertDateUTC = DateTime.UtcNow;
dbContextScope.DbContexts.Get<DPSContext>().Departments.Add(newDepartment);
dbContextScope.SaveChanges();
return Mapper.Map<BusinessModel.Department>(newDepartment);
}
}
Run Code Online (Sandbox Code Playgroud)
为了对这种方法进行单元测试,我在每次测试前做了一些准备:
private IDepartmentsService _departmentsService;
private IDbContextScopeFactory _dbContextScopeFactory;
private IDbContextFactory _dbContextFactory;
private DBModel.DPSContext _dbEntities;
[SetUp]
public void ReInitializeTest()
{
// Setup DbContext with Effort.EF6
string connStr = ConfigurationManager.ConnectionStrings["DPSContext"].ConnectionString; …Run Code Online (Sandbox Code Playgroud) IdentityServer 4的新手。我在文档中的此处遵循IdentityServer4 EntityFramework示例。
运行迁移脚本后
dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
Run Code Online (Sandbox Code Playgroud)
它可以工作,现在我的应用程序具有3个数据库上下文。
我的问题是这两个数据库上下文是做什么的?应用程序数据库上下文和其他两个上下文有什么区别?
如果我更新或添加任何模型,是否需要更新所有三个模型?或者什么时候应该在ApplicationDbContext上运行迁移,什么时候应该在其他两个上运行。
对此有任何见识或文献表示赞赏。谢谢。
dbcontext ×10
c# ×6
poco ×2
.net-6.0 ×1
.net-core ×1
asp.net-mvc ×1
effort ×1
linq ×1
sql ×1
sql-server ×1
unit-testing ×1