根据我自己的经验和朋友的经验,我发现很多公司都有一些奇怪的想法来开发自己的框架和SW工厂(为你构建应用程序的骨架).这些想法通常基于相信自己的框架将比其他任何可用的框架更好.如何处理这些想法以及如何解释它并不总是好的方法去?
为什么我认为内部框架/工厂不好:
为什么我认为公司这样做:
我知道有时需要自己的专用场景解决方案或框架,但我厌倦了所有这些"伟大的内部框架"来创建Web或桌面应用程序.我错了吗?这些框架真的需要(.NET和Java世界)吗?你能为我提供一些例子或理由说明为什么内部框架/工厂是好的?
编辑:
感谢您的回答,但我期待一些建议如何作为开发人员(除了更换工作)处理问题而不是作为经理.
如果模型访问相同的底层数据库,是否有办法从2个不同的实体模型组成查询.
我的方案是:我有一个使用EF进行数据访问的框架.(EDM 1)我有一个客户端应用程序,它使用框架的服务,并使用EF进行自己的数据访问.(EDM2)
在某些情况下,我需要撰写查询并加入跨越2个EDM的实体.
有没有办法在没有从第一个EDM获取内存中的数据然后从第二个EDM的实体在内存中应用其他谓词/连接的情况下执行此操作?
我希望我能以正确的方式阐明这一点
编辑 @Ladislav Mrnka:第一个EDM是可重用框架的数据访问层.将来自此EDM的EF生成实体与消费客户端的实体耦合是没有意义的.如果我这样做,它会破坏API的可重用性并且我必须携带额外的膨胀(客户端的EF元数据和数据库表)每次我想重新部署框架.这也会使设计师在管理模型时变得笨拙.
我目前正在使用你提到的第7项作为解决方案而且性能很糟糕,因为我必须最终返回比使用EDM1的框架所需的更多数据(即实体),然后过滤掉不需要的数据基于基于第二EDM中的实体的属性值的谓词/条件.最终结果是性能下降和DBA不满意.
出于这个原因,我最终将检索实体所需的逻辑推送到SPROC,在该SPROC中,我可以访问EDM使用的表并应用所需的谓词,并使整个查询在DB中运行,而不是将数据存入内存然后过滤掉不必要的.Downside是我不能使用LINQ
你提到的第8项听起来很有意思,但听起来我怀疑你在设计时得到了强烈的打字,或者你呢?你可以在某个地方上传你的代码示例,以便我可以尝试一下吗?
我在一个简单的测试场景中有一个对象,它使用EF Code First并实现IValidatableObject.有一些非常简单的逻辑可以添加验证错误并将其返回.对象上还有其他验证.
但是,在保存对象时 - 基于属性的验证工作 - IValidatableObject接口似乎永远不会触发.调试器不会进入它,并且调用SaveChanges()或GetValidationErrors()时错误永远不会出现.
public class Customer : IValidatableObject {
[Key]
public int Id { get; set; }
[StringLength(50)]
[DisplayName("First Name")]
public string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
[StringLength(50)]
public string LastName { get; set; }
[Required]
[StringLength(100)]
public string Company { get; set; }
[StringLength(200)]
public string Email { get; set; }
[DisplayName("Credit Limit")]
public decimal CreditLimit { get; set; }
[DisplayName("Entered On")]
public DateTime? Entered { get; set; }
public virtual …Run Code Online (Sandbox Code Playgroud) 我有一个写得不好的遗留数据库模式,我正在通过EF Code First工作.我目前正在映射POCO实体,并希望创建一个"地址"复杂类型,并在存储街道地址信息的任何地方使用它.不幸的是,并非所有的地址字段在数据库中都被命名为相同(即,一个表可能具有"Address1",而另一个表将具有"Street1",即使它们引用相同的东西.
有没有办法根据给定的实体为复杂类型创建自定义映射?那个映射是什么样的?
我目前正在尝试使用实体框架4.1的RC及其代码第一种方法为我的域对象实现存储库.现在我有一个域实体"Voyage",它有一个封装在"VoyageNumber"类型中的唯一标识符
public class VoyageNumber
{
private readonly string number;
public VoyageNumber(string number)
{
Validate.NotNull(number, "VoyageNumber is required");
this.number = number;
}
public string Id
{
get { return number; }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在配置DbContext时执行此操作时出现异常:
modelBuilder.Entity<Voyage>().HasKey<VoyageNumber>(k => k.VoyageNumber);
Run Code Online (Sandbox Code Playgroud)
属性'VoyageNumber'不能用作实体'Domain.Model.Voyages.Voyage'的关键属性,因为属性类型不是有效的键类型.只有标量类型,字符串和byte []是受支持的键类型.
当我尝试这个时:
modelBuilder.Entity<Voyage>().HasKey<string>(k => k.VoyageNumber.Id);
Run Code Online (Sandbox Code Playgroud)
属性表达式'k => k.VoyageNumber.Id'无效.表达式应该代表一个属性:C#:'t => t.MyProperty'
我是否真的要丢弃我的VoyageNumber并用原始类型替换它?
.net domain-driven-design entity-framework primary-key ef-code-first
我想使用存储过程从数据库中检索实体,我不关心跟踪更改.我只需要解决所有实体,包括相关实体.
我必须使用SqlCommand吗?
那些复杂的属性,它们也会得到解决吗?
您可以告诉我任何其他限制吗?
谢谢!
我正在尝试使用常见的EntityTypeConfiguration类来为我的所有实体配置主键,以便每个派生的配置类不会重复.我的所有实体都实现了一个公共接口IEntity(它表示每个实体必须具有int类型的Id属性).
我的配置基类如下所示:
public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity : class , IEntity {
public EntityConfiguration() {
HasKey( e => e.Id );
Property( e => e.Id ).HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
}
}
Run Code Online (Sandbox Code Playgroud)
然后每个实体都有自己的特定配置类,扩展这个类,如下所示:
public class CustomerConfiguration : EntityConfiguration<Customer> {
public CustomerConfiguration() : base() {
// Entity specific configuration here
}
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但我遇到的问题是,在运行时,当EF 4.1 RC尝试创建模型时,我会得到以下异常:
System.InvalidOperationException未处理Message =关键组件"Id"不是"Customer"类型的声明属性.验证它是否未从模型中明确排除,并且它是有效的原始属性.来源=的EntityFramework
如果我将CustomerConfiguration类更改为从EntityTypeConfiguration <Customer>扩展并重复主键配置,那么它工作正常,但我失去了共享通用配置的能力(DRY主体是动机).
这里参考的是其他涉及的类:
public interface IEntity {
int Id { get; set; }
}
public class Customer : IEntity {
public virtual int …Run Code Online (Sandbox Code Playgroud) 我想使用EF Code First在两个实体之间创建双向一对一关系.我遇到以下代码的问题.你觉得我应该怎么做?
public class User
{
public string ID { get; set; }
public string LastName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public int ProfileID { get; set; }
public Profile Profile { get; set; }
}
public class Profile
{
public int UserID { get; set; }
public User User { get; set; }
public int ProfileID { get; set; }
public string ProfileName { get; …Run Code Online (Sandbox Code Playgroud) 如何为所有人设置Maven依赖org.springframework?
我的意思是,如何在几行中完成它,而不是为每个模块提供依赖,例如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
等等..
谢谢你的帮助
我在我的项目中使用Entity Framework 4.3 Migrations.我想使用自动迁移,这样当我修改我的域对象和我的上下文类时,我的数据库会在运行项目时自动更新.到目前为止,我有这个工作.
除了自动迁移之外,我还想使用一些添加的迁移,我希望应用程序在运行应用程序时自动跳转到最新版本(基于我添加的迁移).
为了做到这一点,我把它放在global.asax文件中......
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Core.Migrations.Configuration>());
Run Code Online (Sandbox Code Playgroud)
现在这可行,但是当我这样做时,它不再根据我的域对象自动更新数据库.
我希望能够完全删除数据库,然后运行应用程序并运行所有自动迁移,然后运行我的显式迁移并将数据库升级到最新版本.
我知道我已经在之前的项目中使用了这个,但我不确定在这种情况下我做错了什么.
谢谢