Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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#_Entity Framework_Orm_Relational Database_Normalization - Fatal编程技术网

C# 我应该为我的基类使用实体框架上的什么继承策略?

C# 我应该为我的基类使用实体框架上的什么继承策略?,c#,entity-framework,orm,relational-database,normalization,C#,Entity Framework,Orm,Relational Database,Normalization,我有一个具有以下属性的基类: Id, CreatedOn, LastModifiedOn, DeletedOn, IsDeleted 我所有的具体类都继承自这个基类。我应该为基类创建一个单独的表,还是应该在每个具体类的表中包含这些继承的属性 我对数据库规范化不是很熟悉,我在想,在这个场景中是否可以有一个重复的列。实体框架将自动为您包含这些属性。这意味着如果您首先使用代码,EF将生成具有这些属性的Db表 例如: public class EntityBase { [Key

我有一个具有以下属性的基类:

Id, CreatedOn, LastModifiedOn, DeletedOn, IsDeleted
我所有的具体类都继承自这个基类。我应该为基类创建一个单独的表,还是应该在每个具体类的表中包含这些继承的属性


我对数据库规范化不是很熟悉,我在想,在这个场景中是否可以有一个重复的列。

实体框架将自动为您包含这些属性。这意味着如果您首先使用代码,EF将生成具有这些属性的Db表

例如:

public class EntityBase
    {
        [Key, Column(Order = 0)]
        public int Id { set; get; } = -1;

        private DateTime? createDate;

        public DateTime CreateDate
        {
            set
            {
                createDate = value;
            }
            get
            {
                if (createDate.HasValue)
                    return createDate.Value;
                else
                    return DateTime.Now;
            }
        }

        public DateTime? UpdateDate { set; get; }
        public DateTime? DeleteDate { set; get; }

        public bool IsDeleted { set; get; }


        public int CreatedBy { set; get; }

        public int? UpdatedBy { set; get; }

        public int? DeletedBy { set; get; }

    }
假设你有:

public class Test1 : EntityBase 
{
     [MaxLength(500)]
     public string Name {get; set;}
}
生成的迁移将如下所示:

   CreateTable(
            "dbo.Test1",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(maxLength: 500),
                    CreateDate = c.DateTime(nullable: false),
                    UpdateDate = c.DateTime(),
                    DeleteDate = c.DateTime(),
                    IsDeleted = c.Boolean(nullable: false),
                    CreatedBy = c.Int(nullable: false),
                    UpdatedBy = c.Int(),
                    DeletedBy = c.Int(),
                })
            .PrimaryKey(t => t.Id);
因此答案是否定的,您不必为基类创建单独的表。

如果您首先执行模式,那么您的代码将或应该自动生成,因此这些公共属性没有任何好处,除非您在其中执行一些业务逻辑,否则无法想象为什么。让生成的类与表匹配。i、 e.每个人都有身份证;CreatedOn;LastModified等。当代码自动生成时,让它生成所有内容通常是有意义的

首先手工编写的代码可能是另一回事,因为您完全可以使用考虑了这些属性的基类。使用这些特定属性这样做除了可能导致混淆类中哪些属性存在于相应的表中之外,没有什么好处

我应该为基类创建一个单独的表,还是应该在每个具体类的表中包含这些继承的属性


我可能会将它们放在同一个表中,因为在写操作期间,您不希望修改核心表,然后更新另一个表来修改LastModifiedOn。这样做总是需要进行交易,这可能会导致不必要的性能损失。

您没有回答问题,谢谢您的回答。这个场景怎么样。基类在实体框架中使用代码优先的方法时,我对如何或是否需要规范化数据库感到困惑。如果我将person表与patient和doctor分开,我可能会对基类列感到困惑。或者我的方法可能有问题。“LasBeNoDo听起来像是一个新的问题,而不是我应该考虑在数据库和设计上的另一个StAccExchange站点上提问。在这里提问可以说过于宽泛。你必须问问自己,我真的需要DB正常化吗?。它使事情变得复杂,你的应用程序可能不需要它。祝你一切顺利。不知道派生类和其他要求就无法回答。选择一个继承策略——甚至决定是否继承全部——不能基于这一点信息。开始阅读并做出选择。