- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在设置 Entity Framework 4 模型时遇到问题。
联系人对象作为可更新 View 在数据库中公开。同样由于数据库的历史,这个 Contact View 有两个不同的键,一个来自遗留系统。因此,其他一些表使用“ContactID”引用联系人,而其他较旧的表使用“LegacyContactID”引用联系人。
由于这是一个 View ,数据库中没有外键,我正在尝试在设计器中手动添加关联。但是流畅的关联似乎没有提供指定引用哪个字段的方法。
我如何构建这个模型?
public class vwContact
{
public int KeyField { get; set; }
public string LegacyKeyField { get; set; }
}
public class SomeObject
{
public virtual vwContact Contact { get; set; }
public int ContactId { get; set; } //references vwContact.KeyField
}
public class LegacyObject
{
public virtual vwContact Contact { get; set; }
public string ContactId { get; set; } //references vwContact.LegacyKeyField
}
ModelCreatingFunction(modelBuilder)
{
// can't set both of these, right?
modelBuilder.Entity<vwContact>().HasKey(x => x.KeyField);
modelBuilder.Entity<vwContact>().HasKey(x => x.LegacyKeyField);
modelBuilder.Entity<LegacyObject>().HasRequired(x => x.Contact).???
//is there some way to say which key field this reference is referencing?
}
最佳答案
编辑 2:“新事物已经曝光,伙计” - His Dudeness
经过更多的实验和新闻,我发现使用具有不同键的基类和子类本身是行不通的。特别是对于代码优先,如果基本实体未显式映射到表,则它们必须定义一个键。
我在下面留下了建议的代码,因为我仍然建议使用基类来实现 C# 可管理性,但我在代码下面更新了我的答案并提供了其他解决方法选项。
不幸的是,事实表明,由于 EF 4.1+ 代码优先的限制,如果不更改 SQL,您将无法完成您寻求的目标。
public abstract class BaseContact
{
// Include all properties here except for the keys
// public string Name { get; set; }
}
如果您愿意,可以通过流畅的 API 进行设置,但为了便于说明,我使用了数据注释
public class Contact : BaseContact
{
[Key]
public int KeyField { get; set; }
public string LegacyKeyField { get; set; }
}
public class LegacyContact : BaseContact
{
public int KeyField { get; set; }
[Key]
public string LegacyKeyField { get; set; }
}
引用或操作联系人对象的类应该像接口(interface)一样引用基类:
public class SomeCustomObject
{
public BaseContact Contact { get; set; }
}
如果稍后您需要以编程方式确定您正在使用的类型,请使用 typeof()
并相应地操作实体。
var co = new SomeCustomObject(); // assume its loaded with data
if(co.Contact == typeof(LegacyContact)
// manipulate accordingly.
正如我之前在评论中建议的那样,您无论如何都无法将它们映射到单个 View /表,因此您有几个选择:
一个。将您的对象映射到它们的基础表并更改您在存储库和服务类上的“获取/读取”方法从联合 View 中提取 - 或 -
创建第二个 View 并将每个对象映射到相应的 View 。
将一个实体映射到其基础表,将一个实体映射到 View 。
首先尝试(B),创建一个单独的 View ,因为它需要对代码和数据库架构进行最少的更改(您不会摆弄底层表,也不会影响存储过程)。它还确保您的 EF C# POCO 将等效运行(一个 View 和一个表可能会导致怪癖)。 Miguel 在下面的回答似乎与建议大致相同,所以如果可能的话,我会从这里开始。
选项 (C) 似乎最糟糕,因为当映射到不同的 SQL 片段(表与 View )时,您的 POCO 实体可能会表现出无法预料的怪癖,从而导致编码问题。
选项 (A),虽然它最符合 EF 的意图(实体映射到表),但这意味着要获得联合 View ,您必须更改 C# 服务/存储库以与 EF 实体一起使用添加、更新、删除操作,但告诉类似拉取/读取的方法从联合 View 中获取数据。这可能是您的最佳选择,但比 (B) 涉及更多工作,并且从长远来看也可能影响 Schema。越复杂,风险越大。
关于c# - View 中具有多个(单独的)键的 Entity Framework 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010241/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!