0

有没有办法执行以下映射(使用数据库优先方法)

表:(仅出于可读性目的使用类似 C# 的语法定义表)

table MainItems
{
    column PK not-null unique int MainItemKey;
    column string Name;
    column string AspectAInfo;
    column string AspectBInfo;

    // 0 for A, 1 for B, 2 for both (Could be replaced with 2 boolean columns)
    column not-null int AspectABOrBoth;
}

table AspectAMoreInfo
{
    column PK not-null unique in AspectAMoreInfoKey;
    column FK not-null int MainItemKey;
    column string PayLoadA;
}

table AspectBMoreInfo
{
    column PK not-null unique in AspectBMoreInfoKey;
    column FK not-null int MainItemKey;
    column double PayLoadB;
}

实体:

// Map to MainItems table if column AspectABOrBoth is 0 or 2
class TypeAItem
{
    // Map to MainItemKey column
    int TypeAItemKey { get; set; }

    string Name { get; set; } // Map to Name column

    // Navigation property to AspectAMoreInfo rows
    List<TypeAMoreInfo> MoreInfo { get; set; }

    // Navigation property to MainItems row when AspectABOrBoth is 2
    TypeBItem OptionalInnerItemB { get; set; }
}

// Map to MainItems table if column AspectABOrBoth is 1 or 2
class TypeBItem
{
    // Map to MainItemKey column
    int TypeBItemKey { get; set; }

    string Name { get; set; } // Map to Name column

    // Navigation property to AspectBMoreInfo rows
    List<TypeBMoreInfo> MoreInfo { get; set; }
}

// Map to AspectAMoreInfo table
class TypeAMoreInfo
{
    // Map to AspectAMoreInfoKey column
    int TypeAMoreInfoKey { get; set; }

    // Navigation property to MainItems row when MainItems.AspectABOrBoth is 0 or 2
    TypeAItem Owner { get; set; }
}

// Map to AspectBMoreInfo table
class TypeBMoreInfo
{
    // Map to AspectBMoreInfoKey column
    int TypeBMoreInfoKey { get; set; }

    // Navigation property to MainItems row when MainItems.AspectABOrBoth is 1 or 2
    TypeBItem Owner { get; set; }
}

我考虑过但不想采取的可能方向包括:

  1. 在 MainItems 表上方定义 2 个视图并将实体映射到它们。
    (可以使用基本类型,与 Table-Per-Concrete-Type 一起使用。)

  2. 将 2 个可为空的 FK 列添加到指向自身(指向同一行)而不是 AspectABOrBoth 列的 MainItems 表
    (如果 MainItem 是 AspectA,则 1 个不为空,如果 MainItem 是 AspectB,则另一个不为空。)
    (可以使用表拆分与此,基于新的 FK 列。)

4

1 回答 1

0

使用时可以将表拆分为多个实体:

  • 表拆分- 它要求实体仅共享键,并且每个其他属性只能映射到单个实体。
  • TPH 继承- 它要求基础实体定义键和共享属性。子实体可以包含其他属性,但属性不能在子实体之间共享。表必须包含一个或多个特殊列(区分符),这些列将定义记录所代表的继承层次结构中的类型。MSL 不允许对discriminator使用任何复杂的表达式。复杂条件只能创建为所有条件的逻辑与。

如果我查看您的表格,它看起来不像继承。TableAItem并且TableBItem没有任何共享属性。唯一的共享项目可能是关键,这使得您的设计的其余部分非常困难,因为与两者的关系TableAMoreInfo并且TableBMoreInfo将使用MainItem(密钥持有者)而不是子项目创建。

视图看起来更适合解决此问题,但默认情况下,视图在 EF 中为只读,除非您手动修改 SSDL。

于 2011-04-27T19:57:44.327 回答