Entity framework core 实体框架核心2.2拥有的实体,带有UseLazyLoadingProxies
我目前正在开发一个代码库,我想在其中添加一些新的实体和相应的自有实体。因为,在代码库的其他部分,我将不涉及,Entity framework core 实体框架核心2.2拥有的实体,带有UseLazyLoadingProxies,entity-framework-core,lazy-loading,ef-core-2.2,owned-types,Entity Framework Core,Lazy Loading,Ef Core 2.2,Owned Types,我目前正在开发一个代码库,我想在其中添加一些新的实体和相应的自有实体。因为,在代码库的其他部分,我将不涉及,UseLazyLoadingProxies被调用;我收到以下例外情况: System.InvalidOperationException:实体类型“FooOwner”上的导航属性“Foo”不是虚拟的。UseLazyLoadingProxies要求所有实体类型都是公共的、未密封的、具有虚拟导航属性,并且具有公共或受保护的构造函数 如果我将该属性标记为虚拟,则拥有的实体进入一个新表;我也不想要
UseLazyLoadingProxies
被调用;我收到以下例外情况:
System.InvalidOperationException:实体类型“FooOwner”上的导航属性“Foo”不是虚拟的。UseLazyLoadingProxies要求所有实体类型都是公共的、未密封的、具有虚拟导航属性,并且具有公共或受保护的构造函数
如果我将该属性标记为虚拟,则拥有的实体进入一个新表;我也不想要
根据我遇到的github问题,这些似乎是预期的行为
我的问题是:有没有办法解决这个问题,这样,我可以以某种方式将所拥有的实体标记为与所有者实体存储在同一个表中,并且如果可能,总是Include
d,急切地加载
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using NUnit.Framework;
namespace StackOverflowObjectContext.Tests
{
public class Foo
{
public long Id { get; set; }
public int Data { get; set; }
}
public class FooOwner
{
public int Id { get; set; }
public Foo Foo { get; set; }
}
public class FooOwnerMap : IEntityTypeConfiguration<FooOwner>
{
public void Configure(EntityTypeBuilder<FooOwner> builder)
{
builder.HasKey(x => x.Id);
builder.HasOne(x => x.Foo);
}
}
public class StackOverflowObjectContext : DbContext
{
public StackOverflowObjectContext(DbContextOptions options) : base(options) { }
DbSet<FooOwner> FooOwners { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new FooOwnerMap());
base.OnModelCreating(modelBuilder);
}
}
[TestFixture]
public class StackOverflowTest
{
StackOverflowObjectContext _objectContext;
[SetUp]
public void SetUp()
{
var builder = new DbContextOptionsBuilder<StackOverflowObjectContext>()
.UseSqlServer(@"Data Source=.\SQLEXPRESS;Initial Catalog=StackOverflow;Integrated Security=True")
.UseLazyLoadingProxies();
_objectContext = new StackOverflowObjectContext(builder.Options);
}
[Test]
public void CanGenerateCreateScript()
{
var script = _objectContext.Database.GenerateCreateScript();
Debug.WriteLine(script);
}
}
}
使用系统诊断;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.EntityFrameworkCore.Metadata.Builders;
使用NUnit.Framework;
命名空间StackOverflowObjectContext.Tests
{
公开课Foo
{
公共长Id{get;set;}
公共int数据{get;set;}
}
公共类食品所有者
{
公共int Id{get;set;}
公共Foo Foo{get;set;}
}
公共类FooOwnerMap:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
HasKey(x=>x.Id);
builder.HasOne(x=>x.Foo);
}
}
公共类StackOverflowObjectContext:DbContext
{
公共StackOverflowObjectContext(DbContextOptions选项):基本(选项){}
DbSet FooOwners{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
ApplyConfiguration(newfooownermap());
基于模型创建(modelBuilder);
}
}
[测试夹具]
公共类堆栈溢出测试
{
StackOverflowObjectContext\u objectContext;
[设置]
公共作废设置()
{
var builder=new DbContextOptionsBuilder()
.UseSqlServer(@“数据源=。\SQLEXPRESS;初始目录=堆栈溢出;集成安全性=真”)
.UseLazyLoadingProxies();
_objectContext=新的StackOverflowObjectContext(builder.Options);
}
[测试]
public void CanGenerateCreateScript()
{
var script=_objectContext.Database.GenerateCreateScript();
Debug.WriteLine(脚本);
}
}
}
您应该使用OwnsOne
而不是HasOne
HasOne不是“拥有者”。你应该使用OwnsOne。如果拥有的类型在同一个表中,则不需要包括them@miechooy谢谢,你完全正确。当我试图编写一个最小的测试用例时,我完全输入错误,事实上,如果我更正回OwnsOne,则使用一个表,即使该属性是虚拟的。如果你写评论作为回答,我会接受。