我正在尝试使用常见的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) 我真的很难将一些数据插入到2个数据库表中.
我正在使用实体框架4使用Linq而不是WCF数据服务.
这两个表看起来像这样:
CREATE TABLE [dbo].[Accounts] (
[Id] int IDENTITY(1,1) NOT NULL,
[Email] nvarchar(max) NOT NULL,
[Password] nvarchar(max) NOT NULL
);
CREATE TABLE [dbo].[Employees] (
[Id] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(max) NOT NULL,
[Role] nvarchar(max) NOT NULL,
[Account_Id] int NOT NULL
);
ALTER TABLE [dbo].[Employees]
ADD CONSTRAINT [FK_EmployeeAccount]
FOREIGN KEY ([Account_Id])
REFERENCES [dbo].[Accounts]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
Run Code Online (Sandbox Code Playgroud)
每位员工必须只有一个帐户.但是,帐户可能根本没有任何员工.
我已经生成了实体,并公开了一个使用宽松访问规则设置的DataService:
config.SetEntitySetAccessRule( "Accounts" , EntitySetRights.All );
config.SetEntitySetAccessRule( "Employees" , EntitySetRights.All );
Run Code Online (Sandbox Code Playgroud)
使用LinqPad我可以成功插入一个帐户行,如下所示:
var context = this; …Run Code Online (Sandbox Code Playgroud)