【问题标题】:Entity framework, discriminator column, but no inheritance实体框架,鉴别器列,但没有继承
【发布时间】:2013-12-04 01:19:56
【问题描述】:

我想测试一个非常简单的 Code-First 示例。我有一个名为PurchaseItem 的类,它不是从任何基础类继承的,也没有其他类继承自它。它与其他模型完全没有关联:

public class PurchaseItem
{
    public int Id { get; set; } 
    public string Buyer { get; set; }
    public string Item { get; set; }
    public int Quantity { get; set; }
    public int Price { get; set; }
}

这是我的数据库上下文代码。我将数据库初始化器设置为null,因为我已经有了数据库:

public class MiniContext : DbContext
{
    public MiniContext()
    {
        Database.SetInitializer<MiniContext>(null);
    }

    public DbSet<PurchaseItem> PurchaseItems { get; set; }
}

这是我保存记录的代码:

public void SavePurchaseItems(string buyer, string item, int quantity, int price)
{
    PurchaseItem purchaseItem = new PurchaseItem
    {
        Buyer = buyer,
        Item = item,
        Quantity = quantity,
        Price = price
    };
    using (MiniContext context = new MiniContext())
    {
        context.PurchaseItems.Add(purchaseItem);
        context.SaveChanges();
    }
}

没有继承。根本没有继承。只是一个简单的独立表。但我得到的是:

列名“鉴别器”无效。

context.SaveChanges(); 线上。怎么了?我该怎么办?

更新:我已经看到了 EF Code First “Invalid column name 'Discriminator'”但没有继承问题。这个问题并没有解决我的问题。在那个问题中,OP 在他的代码中确实有继承。

【问题讨论】:

  • here :)
  • @JensKloster,该示例没有从任何类继承。我已经看到了它。但是另一个类继承自它。
  • @JensKloster,该问题的答案确实具有继承性。 PersonViewModel 继承自 Person
  • 我被标题冲昏了头脑——它发生了:|
  • @JensKloster:我认为评论是正确的(它是相关的,但不一样)。然而,近距离投票(不知道是谁投的)很糟糕。在进行近距离投票时,必须完全确信它是重复的,因为一旦关闭,问题很少会重新打开。

标签: c# .net entity-framework ef-code-first


【解决方案1】:

您的连接字符串可能与您的上下文不同! 请检查此article

实体框架遵循Convention over Configuration 思想流派。这意味着即使在查找相关连接字符串时,Entity Framework 也会使用您的上下文类的名称(在本例中为 MiniAccounting)并尝试在配置文件中查找具有该名称的连接字符串。

但是,如果它没有找到任何东西,它会回退到 SQL 的轻量级版本(我猜是 SQL CE 或 SQL Express,不确定),它自己创建一个数据库,并尝试插入其中。

在您的情况下,检查配置文件,看看它是否与您的上下文类的名称匹配。如果没有,请使用此构造函数:

public class MiniContext : DbContext
{
    public MiniContext()
         : base("YourConnectionStringNameHere")
    {
        Database.SetInitializer<MiniContext>(null);
    }

    public DbSet<PurchaseItem> PurchaseItems { get; set; }
}

【讨论】:

  • 我仍然不明白为什么当实体中显然没有这样的列时,错误消息会谈到“鉴别器”列。
  • @AndersAbel 我同意你的看法。但是我复制并粘贴代码并检查连接字符串,然后一切都是正确的
猜你喜欢
  • 2011-03-26
  • 1970-01-01
  • 2019-02-17
  • 2011-09-27
  • 1970-01-01
  • 2019-05-09
  • 2011-05-19
  • 2010-10-07
相关资源
最近更新 更多