【问题标题】:Mapping database table with no primary key using fluent API使用 fluent API 映射没有主键的数据库表
【发布时间】:2013-05-08 06:20:19
【问题描述】:

我正在开发一个应用程序,该应用程序具有许多类似的现有表映射

public DbSet<Activity> Activities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Activity>().ToTable("Activity", "MES_WVM");
    modelBuilder.Entity<Activity>().HasKey(r => new { r.ActivityID });
}

对于我最终使用的大多数表格都可以正常工作。我现在的任务是创建一些新功能,这需要我从新表中提取数据。这些表没有主键,我无权更改它。这篇关于 mapping with fluent api 状态的 MSDN 文章

按照惯例,没有指定主键的类型被视为复杂类型。在某些情况下,Code First 不会检测到复杂类型(例如,如果您确实有一个名为 ID 的属性,但您并不意味着它是主键)。在这种情况下,您将使用 fluent API 显式指定类型是复杂类型。

modelBuilder.ComplexType<Details>();

使用上述方法不允许我使用ToTable() 将此类型映射到数据库表。我如何使用流利的 API 做到这一点。我还想强调,我不打算在 DB 键中提供表,即使它们确实应该这样做。

【问题讨论】:

    标签: c# sql-server asp.net-mvc entity-framework


    【解决方案1】:

    如果现有表没有密钥并且您不打算更改它,那么您可能不应该尝试使用 Fluent API 添加密钥。如果实体与原始 POCO 对象的约定不同,Fluent API 将帮助您定义实体之间的映射,但它们创建的映射应该存在于数据存储库中。

    您如何从 Linq 查询中的表中提取数据。如果您愿意,可以将其封装在只读字段中(正如您所说,您需要从新表中提取数据):

    private string _YourData;
    
    public string YourData 
    { 
       get { return _YourData ?? (_YourData = ExistingTable.Single(yourquery)); }
    }
    

    【讨论】:

    • 我不打算使用 Fluent API 添加密钥,但我仍然需要将我的类映射到我的数据库表。应用程序需要知道表和模式名称是什么,因此需要映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多