Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心:扩展实体而不使用部分_C#_.net_Entity Framework_.net Core_Entity Framework Core - Fatal编程技术网

C# 实体框架核心:扩展实体而不使用部分

C# 实体框架核心:扩展实体而不使用部分,c#,.net,entity-framework,.net-core,entity-framework-core,C#,.net,Entity Framework,.net Core,Entity Framework Core,我必须扩展当前数据库实体(Foo)以包含新字段。听起来很容易,但我很难找到解决办法。问题是,我无法为Foo创建分部类,因为它是我正在使用的dll的一部分。我也不可能按照自己的意愿要求修改Foo(或者自己做) 我的项目结构与此类似: // unmodifiable because part of dll class Foo { int Id { get; set; } string Name { get; set; } } // unmodifiable because par

我必须扩展当前数据库实体(
Foo
)以包含新字段。听起来很容易,但我很难找到解决办法。问题是,我无法为
Foo
创建分部类,因为它是我正在使用的dll的一部分。我也不可能按照自己的意愿要求修改Foo(或者自己做)

我的项目结构与此类似:

// unmodifiable because part of dll
class Foo 
{
    int Id { get; set; }
    string Name { get; set; }
}

// unmodifiable because part of dll
interface IFooContext 
{
     DbSet<Foo> Foo { get; set; }
}

class FooContext: DbContext, IFooContext 
{
     DbSet<Foo> Foo { get; set; }
}
我所能做的就是在
dougoader
内部创建属性
DbSet Bar{get;set;}
,但随后我将得到两个几乎相同的数据库表:Foo和Bar

因此,我进行了修改并创建了类
Bar
,其中将包含
FooId
。它产生两个表,其中
Bar
表引用了
Foo

class Bar 
{
     int Id { get; set; }

     Foo Foo { get; set; }
     int FooId { get; set; }

     string Description { get; set; }
}

这两种情况下,将创建一个新的表,我不确定,如果是我寻找的。但是,还有其他方法可以做到这一点并在基类/表中包含新字段吗?

代码优先方法为您提供了至少3个选项来将(继承层次结构)实体映射到表:

  • 您需要的是第1种方法,它将把基类和层次映射到一个表中,但会添加一个额外的列(“Discriminator”作为默认名称)来标识它们的
    类型,当您从数据库查询整行时,该列将用于还原为自己的类型。最重要的是:与其他两种方法相比,第一种方法的性能也最好

    以下是一些很好的帖子,您可以在其中找到实现:

  • 就是这样,

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        ....
    
        modelBuilder.Entity<Foo>()
                .HasDiscriminator<string>("FooType")
                .HasValue<Foo>(nameof(Foo))
                .HasValue<Bar>(nameof(Bar))
                .HasValue<Other>(nameof(Other));
        ...
        base.OnModelCreating(modelBuilder);
    }
    
    模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
    {
    ....
    modelBuilder.Entity()
    .HasDiscriminator(“FooType”)
    .HasValue(名称(Foo))
    .HasValue(条的名称)
    .HasValue(名称(其他));
    ...
    基于模型创建(modelBuilder);
    }
    

    modelBuilder.Entity()
    .HasDiscriminator(“FooType”)
    .HasValue(1)
    .HasValue(2)
    .HasValue(3);
    
    当您无法访问dll时,为什么要扩展它?您可以在您的上下文中完全创建Bar模型(包括Foo的属性),对吗?因为它是框架guts的一部分,依赖于IFooLoader实现,我必须做的是提供它的实现。但同时,我需要为我的用例提供新的参数。
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        ....
    
        modelBuilder.Entity<Foo>()
                .HasDiscriminator<string>("FooType")
                .HasValue<Foo>(nameof(Foo))
                .HasValue<Bar>(nameof(Bar))
                .HasValue<Other>(nameof(Other));
        ...
        base.OnModelCreating(modelBuilder);
    }
    
    modelBuilder.Entity<Foo>()
            .HasDiscriminator<int>("FooType")
            .HasValue<Foo>(1)
            .HasValue<Bar>(2)
            .HasValue<Other>(3);