首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置TPH类的表名?

如何设置TPH类的表名?
EN

Stack Overflow用户
提问于 2022-01-29 23:38:25
回答 1查看 51关注 0票数 0

我知道可以在DbContext的OnModelCreating覆盖中设置表名。但是,当业务对象从基类继承时,我在尝试这样做时遇到了问题。

我的业务对象(来自xaf)是

代码语言:javascript
复制
[DefaultProperty(nameof(UserName))]
public class ApplicationUser : PermissionPolicyUser, 
IObjectSpaceLink, ISecurityUserWithLoginInfo {
public ApplicationUser() : base() {
   UserLogins = new List<ApplicationUserLoginInfo>();
}

[Browsable(false)]
[DevExpress.ExpressApp.DC.Aggregated]
public virtual IList<ApplicationUserLoginInfo> UserLogins { get; set; }
IEnumerable<ISecurityUserLoginInfo> IOAuthSecurityUser.UserLogins => UserLogins.OfType<ISecurityUserLoginInfo>();

ISecurityUserLoginInfo ISecurityUserWithLoginInfo.CreateUserLoginInfo(string loginProviderName, string providerUserKey) {
    ApplicationUserLoginInfo result = ((IObjectSpaceLink)this).ObjectSpace.CreateObject<ApplicationUserLoginInfo>();
    result.LoginProviderName = loginProviderName;
    result.ProviderUserKey = providerUserKey;
    result.User = this;
    return result;
}

}

我的DbContext是这样的

代码语言:javascript
复制
public class JTEFCoreDbContext : DbContext {
 public JTEFCoreDbContext(DbContextOptions<JTEFCoreDbContext> options) : base(options) 
 {
    
 }
 public DbSet<ApplicationUser> Users { get; set; }
 // etc

 protected override void OnModelCreating(ModelBuilder modelBuilder) {
 modelBuilder.Entity<ApplicationUserLoginInfo>(b =>
 {
   modelBuilder.Entity<ApplicationUser>().ToTable("PermissionPolicyUsers");  
  // etc

我的单元测试是这样的

代码语言:javascript
复制
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var connectionString =
                "Server=myserver;Database=mydb;Integrated Security=false;MultipleActiveResultSets=True;user=sa;pwd=mypassword";
            var optionsBuilder = new DbContextOptionsBuilder<JTEFCoreDbContext>().UseSqlServer(connectionString);
            var options = optionsBuilder.Options;
            var db = new JTEFCoreDbContext(options);
            var user =db.Users.FirstOrDefault();   // fails with error 
        }
    }
}

错误是

Microsoft.Data.SqlClient.SqlException:无效对象名“PermissionPolicyUser”

测试项目是

代码语言:javascript
复制
 <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
    <PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
    <PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
    <PackageReference Include="coverlet.collector" Version="3.0.2" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\JT2Core.Module\JT2Core.Module.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Compile Update="Properties\Resources.Designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

</Project>

模块项目是

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <Deterministic>false</Deterministic>
    <AssemblyVersion>1.0.*</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
    <Configurations>Debug;Release;EasyTest</Configurations>
  </PropertyGroup>
  <ItemGroup>
    <None Remove="Model.DesignedDiffs.xafml" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="Model.DesignedDiffs.xafml" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="DevExpress.ExpressApp" Version="21.2.5" />
    <PackageReference Include="DevExpress.ExpressApp.CodeAnalysis" Version="21.2.5" />
    <PackageReference Include="DevExpress.ExpressApp.ConditionalAppearance" Version="21.2.5" />
    <PackageReference Include="DevExpress.ExpressApp.EFCore" Version="21.2.5" />
    <PackageReference Include="DevExpress.ExpressApp.Validation" Version="21.2.5" />
    <PackageReference Include="DevExpress.Persistent.Base" Version="21.2.5" />
    <PackageReference Include="DevExpress.Persistent.BaseImpl.EFCore" Version="21.2.5" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="5.0.0" />
  </ItemGroup>
</Project>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-30 05:38:16

通过将两个类设置为使用表名,我设法使单元测试正常工作。

在OnModelCreating中

代码语言:javascript
复制
modelBuilder.Entity<ApplicationUser>().ToTable("PermissionPolicyUsers");
modelBuilder.Entity<PermissionPolicyUser>().ToTable("PermissionPolicyUsers");

Dev特快票的交联

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70910677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档