我知道这个问题已经有了解决方案(例如这个问题),但是我真的无法将映射逻辑附加到域(POCO类)所在的同一个程序集中.
还有其他方法吗?
我找到了这篇不错的博文,但我无法让它发挥作用.这是模型:
public class Institute
{
/**
Code omitted
**/
protected virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }
private InstituteTextSet _TextSets;
public InstituteTextSet Texts
{
get
{
if (_TextSets == null)
_TextSets = new InstituteTextSet(InnerInstituteTexts);
return _TextSets;
}
}
}
Run Code Online (Sandbox Code Playgroud)
映射代码:
var instituteTextExpression = ObjectAccessor<Institute>.CreateExpression<ICollection<InstituteText>>("InnerInstituteTexts");
institute.HasMany(instituteTextExpression)
.WithRequired()
.HasForeignKey(t => t.InstituteId);
Run Code Online (Sandbox Code Playgroud)
其中CreateExpression定义为:
public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer");
Expression body = Expression.PropertyOrField(param, propertyOrFieldName);
LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param); …Run Code Online (Sandbox Code Playgroud) code-first entity-framework-4 ef-code-first entity-framework-ctp5 entity-framework-4.1
我正在用EF做我的第一个项目,我打算去代码优先模型.我试图找到一些关于处理一个相当经典的"查找表"场景的指导.
我正在处理一个非常规范的情况,我会坚持地址数据.所以,我有一个简单的地址DTO ......
public class Address
{
public int Id { get; set; }
public virtual string StreetAddress1 { get; set; }
public virtual string StreetAddress2 { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string ZipCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在state属性中,我想存储标准的美国双字母状态代码.出于验证目的,我希望在生成的Address表和相当标准的状态查找表之间建立标准的一对多外键关系.该表可能包含一个ID,两个字母的代码和一个包含完整州名的第三列.
我希望使用这个状态查找表来填充和说明下拉样式框等,并且还可以作为对地址实体中提交的State的验证.相当常见的东西.所以,我有几个简单(我希望)的问题.
我在这里明确表达了我的观点,我有点挣扎,所以如果我不清楚,可以随意询问更多细节.
提前致谢.在UI中适当?
再次尝试这个问题,因为我的第一次尝试几乎没有连贯性:p
所以我非常困惑并使用Entity Framework Code First
我有一个Forest类.
我有一个Tree类.
每个森林都有很多树
当我试图序列化时,我得到了循环引用
public class Forest
{
public Guid ID { get; set; }
public virtual List<Tree> Trees { get; set; }
}
public class Tree
{
public Guid ID { get; set; }
public Guid? ForestId {get;set;}
[ForeignKey("ForestId")]
public virtual Forest Forest {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
每个森林都有树木,但不是每棵树都在森林里.这样做时,我会遇到Multiplicity的错误
@(Html.Raw(Json.Encode(Model)))
Run Code Online (Sandbox Code Playgroud)
模型是森林的地方
如果我做ForestId了一个Guid而不是Guid?我得到循环引用错误.
我也尝试过protected override void
OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
modelBuilder.Entity<Forest>()
.HasMany(x => x.Tree)
.WithOptional()
.HasForeignKey(y => y.ForestId);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
我的Seed()方法永远不会被调用.当我Update-Database从软件包管理器控制台执行操作时调用它,但从代码运行时从不调用它.如果删除我的数据库,则会创建所有表(因此执行我的迁移类),但我的Seed()代码永远不会被调用.MVC 4,实体框架工作5代码优先.
Global.asax中:
protected void Application_Start()
{
Database.SetInitializer<MyContext>(new DbInitializer());
}
Run Code Online (Sandbox Code Playgroud)
DBINIT:
internal class DbInitializer : MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>
{
}
Run Code Online (Sandbox Code Playgroud)
的DbContext:
public partial class MyContext : DbContext
{
public MyContext() : base("DefaultConnection")
{
}
// public DBSets....
}
Run Code Online (Sandbox Code Playgroud)
组态:
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
// The constructor is actually called
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyContext context)
{
// My seed code, never called
}
Run Code Online (Sandbox Code Playgroud)
可能有什么不对?
我正在学习实体框架(目前正在使用EF6 beta),而我正在使用现有数据库上的代码优先模式.DbContext使用T4模板自动创建实体和类.
我想阻止DbContext在运行时创建/更改任何内容到数据库中.
我怎样才能做到这一点?
我有几个类需要从一个包含Id的公共基类派生.暂时忽略除了其中一个之外的其他所有内容,让我们说:
public class MyBase {
[Key]
public int Id { get; set; }
}
public class MyName : MyBase {
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的上下文(DataContext)看起来像这样:
public DbSet<MyName>MyNames { get; set; }
// to avoid having EF make a MyBases table and instead map
// MyBase.Id into MyNames and my other derived classes I do this ...
protected override void OnModelCreating((DbModelBuilder modelBuilder) {
modelBuilder.Entity<MyBase>()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<MyName>()
.Map(m => {
m.MapInheritedProperties();
m.ToTable("MyNames");
});
}
Run Code Online (Sandbox Code Playgroud)
生成的数据库,当我启用迁移,添加迁移初始化和更新数据库时,我得不到名为MyBases的表,而是在MyNames中获取Id列 …
您可以使用Fluent Api指定唯一键:
public class MyContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasIndex(u => u.Nickname)
.IsUnique();
}
}
public class User
{
public int UserId { get; set; }
public string Nickname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是你可以用数据注释来做吗?
方法更改EF7 Beta 8:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Index(u => u.Nickname)
.Unique();
}
Run Code Online (Sandbox Code Playgroud) entity-framework code-first data-annotations entity-framework-core
我有两个实体(Customer和CustomerRole),并希望声明它们之间的多对多关系.我可以使用以下代码:
modelBuilder.Entity<CustomerRole>()
.HasMany(cr => cr.Customers)
.WithMany(c => c.CustomerRoles)
.Map(m => m.ToTable("Customer_CustomerRole_Mapping"));
Run Code Online (Sandbox Code Playgroud)
但它创建了关系(和第三个映射表),默认情况下关闭级联删除.如何在使用多对多时告诉EF创建与级联删除关系的关系?
我们公司提供一套操作数据库中数据的各种应用程序.每个应用程序都有其特定的业务逻辑,但所有应用程序共享业务规则的公共子集.常见的东西包含在一堆用C++编写的遗留COM DLL中,它们使用"经典ADO"(它们通常调用存储过程,有时它们使用动态SQL).这些DLL中的大多数都具有基于XML的方法(更不用说基于专有格式的方法!)来创建,编辑,删除和检索对象,还有额外的操作,例如快速复制和转换许多实体的方法.
中间件DLL现在已经很老了,我们的应用程序开发人员需要一个新的面向对象(不是面向xml)的中间件,可以很容易地被C#应用程序使用.该公司的许多人都说我们应该忘记旧的范例,转而采用新的酷炫的东西,比如Entity Framework.他们对POCO的简单性很感兴趣,他们希望使用LINQ来检索数据(基于Xml的DLL查询方法不是那么容易使用,并且永远不会像LINQ那样灵活).
所以我正在尝试为简化场景创建一个模型(真实场景要复杂得多,在这里我只发布一个简化场景的简化子集!).我正在使用Visual Studio 2010,实体框架5代码优先,SQL Server 2008 R2.如果我犯了愚蠢的错误,请怜悯,我是Entity Framework的新手.由于我有许多不同的疑虑,我会将它们分别发布.这是第一个.传统的XML方法有这样的签名:
bool Edit(string xmlstring, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)
使用这样的格式:
<ORDER>
<ID>234</ID>
<NAME>SuperFastCar</NAME>
<QUANTITY>3</QUANTITY>
<LABEL>abc</LABEL>
</ORDER>
Run Code Online (Sandbox Code Playgroud)
Edit方法实现了以下业务逻辑:当Quantity更改时,必须对具有相同Label的所有Orders应用"自动缩放".例如,有三个订单:OrderA的数量= 3,标签= X.订单B的数量= 4,标签= X.订单C的数量= 5,标签= Y.我调用Edit方法为OrderA提供新的数量= 6,即我将OrderA的数量加倍.然后,根据业务逻辑,OrderB的数量必须自动加倍,并且必须变为8,因为OrderB和OrderA具有相同的标签.不得更改OrderC,因为它具有不同的标签.
我如何使用POCO类和实体框架复制它?这是一个问题,因为旧的Edit方法一次只能更改一个订单,而实体框架可以在调用SaveChanges时更改大量订单.此外,对SaveChanges的单次调用也可以创建新的订单.临时假设,仅适用于此测试:1)如果同时更改了许多订单数量,并且所有这些订单数量的比例因子都不相同,则不进行缩放; 2)新添加的订单即使具有相同的缩放订单标签也不会自动缩放.
我试图通过重写SaveChanges来实现它.
POCO课程:
using System;
namespace MockOrders
{
public class Order
{
public Int64 Id { get; set; }
public string Name { get; set; }
public string Label { get; set; }
public decimal Quantity { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
迁移文件(创建索引):
namespace MockOrders.Migrations
{
using …Run Code Online (Sandbox Code Playgroud) c# entity-framework savechanges code-first entity-framework-5
我有一个像下面的存储过程,它接受1个输入参数(Name)并返回2个输出参数(EmployeeId和Salary).我们的存储过程会将Name插入Employee表并返回EmployeeId和Salary.
CREATE PROCEDURE dbo.insertemployee
@iName varchar(500),
@OEmployeeId int OUTPUT,
@OSalary Money OUTPUT
Run Code Online (Sandbox Code Playgroud)
我们正在使用EF Code First方法.我能够将记录插入到employee表中,但无法找到如何访问我的两个输出参数.我知道我需要使用如下.任何人都可以告诉我一定是什么结果.根据MSDN,它可以是一个具有列名作为属性的类.但我的情况是我们没有返回我的表的列,但我们使用两个输出参数,我需要知道如何访问这两个输出参数@OEmployeeId和@OSalary.
context.Database.SqlQuery<Result>(" exec dbo.insertemployee....);
public class Result
{
// what properties I must give here
}
Run Code Online (Sandbox Code Playgroud)