LINQ - Что такое дискриминатор? [Дубликат]

У меня была та же проблема, и это было потому, что моя ссылка на jQuery.js не была в теге. Как только я переключил это, все начало работать.

Anthony

127
задан Ingako 11 April 2016 в 02:02
поделиться

6 ответов

Оказывается, что Entity Framework предположит, что для любого класса, который наследуется от класса POCO, который сопоставляется с таблицей в базе данных, требуется столбец Discriminator, даже если производный класс не будет сохранен в БД.

Решение довольно простое, и вам просто нужно добавить [NotMapped] в качестве атрибута производного класса.

Пример:

class Person
{
    public string Name { get; set; }
}

[NotMapped]
class PersonViewModel : Person
{
    public bool UpdateProfile { get; set; }
}

Теперь, даже если вы на карте класс Person в таблицу Person в базе данных, столбец «Discriminator» не будет создан, потому что производный класс имеет [NotMapped].

В качестве дополнительного совета вы можете использовать [NotMapped] для свойств, которые вы не хотите отображать в поле в БД.

270
ответ дан Amirhossein Mehrvarzi 27 August 2018 в 22:02
поделиться

эта ошибка происходит со мной, потому что я сделал следующее

  1. Я изменил имя столбца таблицы в базе данных
  2. (я не использовал Update Model from database в Edmx) I Переименовано вручную. Имя свойства, соответствующее изменению схемы базы данных.
  3. . Я сделал несколько рефакторингов, чтобы изменить имя свойства в классе так же, как схема базы данных и модели в Edmx

Хотя все это, я получил эту ошибку

, поэтому what to do

  1. I Удалена модель из Edmx
  2. Щелкните правой кнопкой мыши и Update Model from database

это приведет к восстановлению модели, а структура сущности will не give you this error

надеюсь, что эта помощь вам

1
ответ дан Basheer AL-MOMANI 27 August 2018 в 22:02
поделиться

Я получаю ошибку в другой ситуации, и вот проблема и решение:

У меня есть 2 класса, полученные из одного базового класса с именем LevledItem:

public partial class Team : LeveledItem
{
   //Everything is ok here!
}
public partial class Story : LeveledItem
{
   //Everything is ok here!
}

Но в своем DbContext я скопировал некоторый код, но забыл изменить одно из имени класса:

public class MFCTeamDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Other codes here
        modelBuilder.Entity<LeveledItem>()
            .Map<Team>(m => m.Requires("Type").HasValue(ItemType.Team));
    }

public class ProductBacklogDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Other codes here
        modelBuilder.Entity<LeveledItem>()
            .Map<Team>(m => m.Requires("Type").HasValue(ItemType.Story));
    }

Да, вторая карта & lt; Команда> должна быть Map & lt; История>. И это стоило мне полдня, чтобы понять это!

2
ответ дан cheny 27 August 2018 в 22:02
поделиться

Другой сценарий, когда это происходит, - это когда у вас есть базовый класс и один или несколько подклассов, где по крайней мере один из подклассов вводит дополнительные свойства:

class Folder {
  [key]
  public string Id { get; set; }

  public string Name { get; set; }
}

// Adds no props, but comes from a different view in the db to Folder:
class SomeKindOfFolder: Folder {
}

// Adds some props, but comes from a different view in the db to Folder:
class AnotherKindOfFolder: Folder {
  public string FolderAttributes { get; set; }
}

Если они отображаются в DbContext, как показано ниже, ошибка «Недопустимое имя столбца« Дискриминатор »возникает, когда доступ к любому типу, основанному на базовом типе Folder:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Folder>().ToTable("All_Folders");
  modelBuilder.Entity<SomeKindOfFolder>().ToTable("Some_Kind_Of_Folders");
  modelBuilder.Entity<AnotherKindOfFolder>().ToTable("Another_Kind_Of_Folders");
}

Я обнаружил, что для исправления проблемы мы извлекаем реквизиты Folder к базовому классу (который не отображается в OnModelCreating()), так же - OnModelCreating не должен быть изменен:

class FolderBase {
  [key]
  public string Id { get; set; }

  public string Name { get; set; }
}

class Folder: FolderBase {
}

class SomeKindOfFolder: FolderBase {
}

class AnotherKindOfFolder: FolderBase {
  public string FolderAttributes { get; set; }
}

Это устраняет проблему, но я не знаю почему!

3
ответ дан meataxe 27 August 2018 в 22:02
поделиться

Я только что столкнулся с этим, и моя проблема была вызвана наличием двух сущностей как с System.ComponentModel.DataAnnotations.Schema.TableAttribute, относящихся к одной и той же таблице.

, например:

[Table("foo")]
public class foo
{
    // some stuff here
}

[Table("foo")]
public class fooExtended
{
    // more stuff here
}

второй с foo до foo_extended исправил это для меня, и теперь я использую Table Per Type (TPT)

7
ответ дан Seph 27 August 2018 в 22:02
поделиться

Вот синтаксис Fluent API.

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent- api-samples.aspx

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { 
        get {
            return this.FirstName + " " + this.LastName;
        }
    }
}

class PersonViewModel : Person
{
    public bool UpdateProfile { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // ignore a type that is not mapped to a database table
    modelBuilder.Ignore<PersonViewModel>();

    // ignore a property that is not mapped to a database column
    modelBuilder.Entity<Person>()
        .Ignore(p => p.FullName);

}
41
ответ дан Walter Stabosz 27 August 2018 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: