【问题标题】:ASP MVC Entity Framework Code first model using existing class使用现有类的 ASP MVC 实体框架代码第一个模型
【发布时间】:2017-09-06 15:39:41
【问题描述】:

知道标题有点含糊,对我的真正问题的描述性不是很好,但是就这样吧。

我有一个新的 ASP MVC 项目,我在其中设置了 EF。它就像一个魅力。 现在我想创建一个新的代码优先模型,我将用它来存储 RSS 提要项。

我不想从头开始创建模型,而是非常想使用System.ServiceModel.Syndication.SyndicationItem 作为我的模型的基础。我可能想添加一些自定义字段,但现在我几乎可以使用完全相同的字段和字段类型。

那么我的问题是,我可以从这个类继承到我的代码优先模型吗?还是我必须将完全相同的字段和字段类型加倍?

【问题讨论】:

  • 试一试,看看是否有效!
  • 我看不出这不起作用的任何原因,EF 通常对模型中使用的实体类型没有太大限制。
  • 谢谢,我试过了,但没有成功:(

标签: asp.net-mvc entity-framework code-first


【解决方案1】:

如果您只关注 SyndicationItem 和 SyndicationCategory 并且不关心忽略某些属性,则可以尝试以下操作:

public class FeedItem : SyndicationItem
{
    [Key]
    public int Id { get; set; }

    // additional properties go here
}

public class MyContext : DbContext
{
    public MyContext()
        : base("name=MyContext")
    {

    }

    public DbSet<FeedItem> FeedItems { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<FeedItem>().HasKey<int>(f => f.Id);
        modelBuilder.Entity<SyndicationCategory>().HasKey(c => c.Name);

        // Ignore entities
        modelBuilder.Ignore<SyndicationPerson>();
        modelBuilder.Ignore<SyndicationLink>();
        modelBuilder.Ignore<SyndicationContent>();
        modelBuilder.Ignore<SyndicationElementExtension>();

        // Ignore properties
        modelBuilder.Entity<FeedItem>().Ignore(f => f.AttributeExtensions);
    }
}

【讨论】:

  • 我试过了,但没有运气。但我想我还必须创建其他相关类作为代码优先模型。前任。 screencast.com/t/CSXxu2DKW
  • 是的,这行得通。但我也想包括类别。
【解决方案2】:

好的,我试过了。

型号

namespace App.Models
{
    public class FeedItem : System.ServiceModel.Syndication.SyndicationItem
    {
    }
}

数据库上下文

namespace App.DAL
{
    public partial class DbContext : IdentityDbContext<ApplicationUser>
    {
        public DbContext() : base("name=DbContext")
        {
        }

        public static DbContext Create()
        {
            return new DbContext();
        }

        public DbSet<FeedItem> FeedItems { get; set; }
    }
}

并在运行应用程序时得到这个回报。

App.DAL.SyndicationPerson: : EntityType 'SyndicationPerson' 没有定义键。为此定义密钥 实体类型。 App.DAL.SyndicationElementExtension: : EntityType 'SyndicationElementExtension' 没有定义键。定义 此 EntityType 的键。 App.DAL.Syndication类别: : EntityType 'SyndicationCategory' 没有定义键。定义键 对于这个 EntityType。 App.DAL.SyndicationLink: : EntityType 'SyndicationLink' 没有定义键。为此定义密钥 实体类型。 SyndicationContents: : 引用的 EntitySet 结束“FeedItem_Copyright_Target”的“SyndicationContents”不能 在包含的 EntityContainer 中找到。 SyndicationContents: : 的 为 End 引用了 EntitySet 'SyndicationContents' 在“SyndicationFeed_Copyright_Target”中找不到 包含实体容器。 SyndicationContents: : 被引用的 End 的 EntitySet 'SyndicationContents' 在“SyndicationFeed_Description_Target”中找不到 包含实体容器。 SyndicationContents: : 被引用的 End 'SyndicationFeed_Title_Target' 的 EntitySet 'SyndicationContents' 在包含的 EntityContainer 中找不到。 SyndicationContents: : 引用的 EntitySet 'SyndicationContents' 在包含中找不到 End 'FeedItem_Summary_Target' 实体容器。 SyndicationContents: : 引用的 EntitySet 结束“FeedItem_Title_Target”的“SyndicationContents”不能 在包含的 EntityContainer 中找到。辛迪加人: EntityType:EntitySet 'SyndicationPersons' 基于类型 没有定义键的“SyndicationPerson”。 SyndicationElementExtensions:实体类型:实体集 “SyndicationElementExtensions”基于类型 没有定义键的“SyndicationElementExtension”。 SyndicationCategories: EntityType: EntitySet 'SyndicationCategories' 基于没有定义键的类型“SyndicationCategory”。 SyndicationLinks: EntityType: EntitySet 'SyndicationLinks' 基于 键入没有定义键的“SyndicationLink”。联合内容: EntityType:EntitySet 'SyndicationContents' 基于类型 没有定义键的“SyndicationContent”。

我可能错过了什么。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2012-05-23
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多