У меня была та же проблема, и это было потому, что моя ссылка на jQuery.js не была в теге. Как только я переключил это, все начало работать.
Anthony
Оказывается, что 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]
для свойств, которые вы не хотите отображать в поле в БД.
эта ошибка происходит со мной, потому что я сделал следующее
Update Model from database
в Edmx) I Переименовано вручную. Имя свойства, соответствующее изменению схемы базы данных. Хотя все это, я получил эту ошибку
, поэтому what to do
Update Model from database
это приведет к восстановлению модели, а структура сущности will
не give you this error
надеюсь, что эта помощь вам
Я получаю ошибку в другой ситуации, и вот проблема и решение:
У меня есть 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; История>. И это стоило мне полдня, чтобы понять это!
Другой сценарий, когда это происходит, - это когда у вас есть базовый класс и один или несколько подклассов, где по крайней мере один из подклассов вводит дополнительные свойства:
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; }
}
Это устраняет проблему, но я не знаю почему!
Я только что столкнулся с этим, и моя проблема была вызвана наличием двух сущностей как с 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)
Вот синтаксис 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);
}