我们正在遗留数据库上创建一个EntityFramework CodeFirst DAL (这意味着我们大多数时候都遇到了它的设计错误).
域模型(非常)简单:我们有抽象卡,子类型为HomeCard,CarCard,OwnerCard和RenterCard.确切地说:
abstract class Card {}
class HomeCard: Card {}
class CarCard: Card {}
class OwnerCard: Card {}
class RenterCard: Card {}
Run Code Online (Sandbox Code Playgroud)
数据库模型遵循表格卡片,家庭,汽车,所有者和租用者,其中卡片包含公共列,其他表格包含与特定类别相关的列.这正是TPT的意思,它完美映射到EntityFramework.
在重构之后,我们发现(并非出乎意料)Home和Car确实共享了一些属性,而Owner和Renter也是这样做的.并且它不仅仅是为了美观,而且一些功能将更容易实现(例如按名称搜索所有者和租用者,或者由所有者搜索家庭和卡片).所以我们希望我们的域模型看起来像这样:
abstract class Card {}
abstract class ProperyCard: Card {}
class HomeCard: ProperyCard {}
class CarCard: ProperyCard {}
abstract class PersonCard: Card {}
class OwnerCard: PersonCard {}
class RenterCard: PersonCard {}
Run Code Online (Sandbox Code Playgroud)
但是我们仍然有相同的数据库模型,这意味着我们在TPT和TPC之间有一些奇怪的组合.我们通过EF/CodeFirst映射它的所有尝试都失败了.有关使它工作的任何建议吗?
PS我们的基本表卡,确实有一个鉴别器字段,如果这可能有任何帮助.
所以基本上我有这个方法.
public List<Customer> FilterCustomersByStatus(List<Customer> source, string status)
{
return (List<Customer>)source.Where(c => c.Status == status);
}
Run Code Online (Sandbox Code Playgroud)
我抛出一个它无法投射的错误:
无法将类型为'WhereListIterator`1 [AppDataAcces.Customer]'的对象转换为'System.Collections.Generic.List`1 [AppDataAcces.Customer]'.
为什么...?由于底层类型是相同的,Enumerable.Where是否创建了WhereListIterator的新实例,如果是这样,为什么有人会这样做,因为这是不必要的性能和功能损失,因为我总是要创建一个新列表(.ToList( ))
string sql = "Select UserId From User where UserName='Gheorghe'";
SqlCommand cmd=new SqlCommand(sql, connection);
cmd.ExecuteScalar(); //this statement return 0
Run Code Online (Sandbox Code Playgroud)
但我想获取用户的ID?我怎么才能得到它?
我使用EF代码优先迁移:
https://msdn.microsoft.com/en-us/data/jj591621.aspx
add-migration
,update-database
等全部由包管理器控制台VS.叫
我还使用 SlowCheetah 来管理我们拥有的各种环境,特别是包括管理每个开发人员都有自己的数据库副本这一事实,以便他们可以更新他们的模型更改,而无需将其他人锁定在数据库之外。因此,更改的配置值之一是目标数据库名称。
(出于我不会介绍的原因,我们不使用connectionStrings
.config
此类设置,而是将 DB 名称放在appSettings
块中)
我的包含模型和迁移的TheCustomer.Database
项目是项目。
如果我手动更改 中的appSetting
值TheCustomer.Database/app.config
并运行迁移,它会正确使用配置值 - 所以配置基本上是有效的。
但是如果我设置一个 SlowCheetah 转换来修改给定构建配置的值,选择该配置,重建代码,然后运行迁移,那么它不会应用转换;它使用 base 中的值app.config
,而不是app.SelectBuildConfig.config
SlowCheetah 总体上运行良好 - 当我运行 sln 来获取网站时,它使用了由 VS Build Config 确定的正确 Db。
有什么想法吗?
编辑:
配置文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<appSettings>
<add key="DbName" value="This Default …
Run Code Online (Sandbox Code Playgroud) 有可能成为一个where var1!=var2
?因为当我尝试编译时说它是一个无效的运算符.(我也试过NOT IS
).
完整的错误消息:
Invalid use of '.', '!', or '()'. in query expression
'emp_course.e_id!=employee.e_id'
Run Code Online (Sandbox Code Playgroud)