实体框架正确使用数据Anotations的数据库优先(Entity Framework Databa

2019-10-18 01:33发布

我有一个项目的EF和Code First方法有使用数据注释的是直线前进。 现在,我与数据库优先工作,我看到使用数据注释是更具体的,所以我想知道实现它的正确步骤。

我的项目,提供数据访问的结构是这样的:

ModelExtensions是我创建的数据注释添加到我的所有文件DbContextModel.tt实体。

这是我在文件中的一个结构ModelExtensions

using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace DataAccess.ModelExtensions
{
    [MetadataType(typeof(MCS_ContentTypesMetaData))]
    public partial class MCS_ContentTypes : BaseEntity
    {

    }

    internal sealed class MCS_ContentTypesMetaData
    {
        [Required]
        [StringLength(10)]
        public string Name { get; set; }
    }
}

我这里有几个问题。 首先 - 命名空间。 它应该是这样的namespace DataAccess.ModelExtensions或我不得不删除.ModelExtensions部分。 我是第一次有使用DB看着一个项目的命名空间只是DataAccess不知道为什么它需要(如果有的话)。 而且-我需要一些其他的引用添加到DbContextModel.tt实体? 现在我用这个标准的C#类,然后将其重命名为: public partial class MCS_ContentTypes : BaseEntity 。 我必须用特殊的方法来创建这些明确暴露实体与该文件之间的联系?

Answer 1:

1)您的扩展模型的命名空间必须是相同的EF自动生成的实体类的命名空间-如果命名空间DbContextModel.tt实体类是DataAccess ,您应该将类的命名空间设置为DataAccess

2)我不会在这种方法完全搞定你的问题,但是,实体类和你的类的名称必须相同。

下面的例子说明它应该是什么。 假设EF生成以下实体类为您提供:

namespace YourSolution
{
    using System;
    using System.Collections.Generic;

    public partial class News
    {
        public int ID { get; set; }
        public string Title { get; set; }        
    }
}

所以,你的部分类应该是这样的:

namespace YourSolution
{
    [MetadataType(typeof(NewsAttribs))]
    public partial class News
    {
        // leave it empty.
    }

    public class NewsAttribs
    {            
        // Your attribs will come here.

        [Display(Name = "News title")]
        [Required(ErrorMessage = "Please enter the news title.")]
        public string Title { get; set; }

        // and other properties you want...
    }
}

所以,你不需要任何: BaseEntity继承。



文章来源: Entity Framework Database First with proper use of Data Anotations