3

我在实体模型中添加了新属性,因为新列已添加到数据库表中。但是在该列中可能存在或可能存在于其他客户端数据库中。那么,如何处理呢?我试过modelBuilder.Entity<Customer>().Ignore(customer => customer.FullName); 但它没有忽略实体中的属性。因为我们有实体映射类,所以它不会忽略它。请问解决方法?

4

3 回答 3

1

如果添加 [NotMapped] 属性,实体框架将不会为其创建列。

using System.ComponentModel.DataAnnotations.Schema;

namespace DomainModel
{
    public partial class Customer
    {
        public int Id { get; set; }

        public string Name { get; set; }

        [NotMapped]
        public string FullName { get; set; }
    }
}

或者,如果您想映射该列,但在某些数据库中它已经存在,那么这里有一个迁移,它只会在该列不存在时添加该列。

namespace DataAccess.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class AddFullNameToCustomer : DbMigration
    {
        public override void Up()
        {
            Sql(@"IF COL_LENGTH('Customer', 'FullName') IS NULL
            BEGIN
                ALTER TABLE Customer
                ADD [FullName] varchar(200) null
            END");
        }
        
        public override void Down()
        {
        }
    }
}
于 2020-10-08T13:48:22.690 回答
1


add你需要使用System.ComponentModel.DataAnnotations.Schema添加[NotMapped]属性;

namespace DomainModel
{
    public partial class Customer
    {
        public int Id { get; set; }

        public string Name { get; set; }

        [NotMapped]
        public string FullName { get; set; }
    }
}

有些人更喜欢模型类非常干净——没有任何数据注释。他们更喜欢配置DataContext类来完成。您可以对类属性使用 Ignore 方法来防止它映射到数据库列。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Customer>().Ignore(customer => customer.FullName);
            base.OnModelCreating(modelBuilder);
        }
于 2020-10-18T02:26:31.170 回答
0

停下来吧。你正在为自己创造一个痛苦的世界。

如果你想拥有一个动态模式,那么你根本不应该使用实体框架

通过创建一个迁移来简化和避免所有这些令人头疼的问题,该迁移可确保在每个数据库中创建字段(以便在运行时,上下文将始终与数据库匹配)并确保在应用程序运行之前执行迁移。

于 2020-10-19T00:15:45.253 回答