C# EF6:代码优先复杂类型

C# EF6:代码优先复杂类型,c#,entity-framework,sql-server-ce,domain-driven-design,C#,Entity Framework,Sql Server Ce,Domain Driven Design,我很难让EntityFramework将带有值对象(复杂类型)字段的域实体类展平到一个表中 如果我告诉我的模型构建器忽略我的值对象/复杂类型,一切都会正常工作,但这会导致我的表中缺少值对象的所有属性。一旦删除ignore语句,我就会得到“在多个位置创建跨实体共享的值”。如果我查看生成的CE SQL文件,我会看到一个附加表,该表以我的域类命名,附加了1,并且仅包含值对象参数 一些代码: 我的域类: public User { private User(){} public lon

我很难让EntityFramework将带有值对象(复杂类型)字段的域实体类展平到一个表中

如果我告诉我的模型构建器忽略我的值对象/复杂类型,一切都会正常工作,但这会导致我的表中缺少值对象的所有属性。一旦删除ignore语句,我就会得到“在多个位置创建跨实体共享的值”。如果我查看生成的CE SQL文件,我会看到一个附加表,该表以我的域类命名,附加了1,并且仅包含值对象参数

一些代码:

我的域类:

public User {

    private User(){}
    public long Id {get; private set;} // dont ask, inherited legacy database
    public string UserId { get; private set; }
    public string Domain { get; private set; }
    public AuditIformation AuditDetails {get ; private set;}

    //..domain logic etc
}

public AuditInformation : IValueObject {
    public long CreatedByUserId { get; private set; }
    public DateTime CreatedDate { get; private set; }
} 
我的存储库项目(先编写代码)具有以下特性:

public partial class myContext : DbContext {

    protected override void OnModelCreating(DbModelBuilder mb) {

        mb.Conventions.Remove<PluralizingTableNameConvention>(); 

        mb.ComplexType<Domain.Model.AuditInformation>();
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedDate).HasColumnName("Created_On");
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedByUserId).HasColumnName("Created_By");

        //This line lets everything work but doesn't include my 
        //AuditInformation attributes in my User Table.
        mb.Ignore<Domain.Model.AuditInformation>(); // <== I think I need to remove this

        //..

        mb.Entity<User>().Map(a => {
            a.Property(x => x.Id).HasColumnName("Id");
            a.Property(x => x.UserId).HasColumnName("User_Id");
            a.Property(x => x.Domain).HasColumnName("User_Dmain");
            })
        .HasKey(x => x.Id)
        .ToTable("Tbl_User");   //<==Again, dont ask

  }
}
但我得到的只是:

[TBL_USER] 
ID AS BIGINT,
USER_ID as VARCHAR(MAX),
USER_DMAIN AS VARCHAR(MAX),
如果我删除忽略线,我会得到这个奖金表

[USER1]  <<==Note, named after the domain class, not the destination table.. 
ID AS BIGINT,
CREATED_ON as DATE,
CREATED_BY as BIGINT
我做了很多搜索,但是我找不到任何具体的例子来将我的值对象属性持久化到为我的域对象创建的表中。有人能告诉我哪里出了问题吗?

试试这个:

public class AuditInformation
{
    public long CreatedByUserId { get; set; }
    public DateTime CreatedDate { get; set; }
}

public abstract class AuditInfo
{
    public AuditInformation AuditDetails { get; set; }

    public AuditInfo()
    {
        this.AuditDetails = new AuditInformation();
        this.AuditDetails.CreatedByUserId = 0;
        this.AuditDetails.CreatedDate = DateTime.Now;
    }
}

public User : AuditInfo
{
    private User(){}
    public long Id {get; private set;} // dont ask, inherited legacy database
    public string UserId { get; private set; }
    public string Domain { get; private set; }

    //..domain logic etc
}

public partial class myContext : DbContext 
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        mb.Conventions.Remove<PluralizingTableNameConvention>();

        mb.ComplexType<Domain.Model.AuditInformation>();
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedDate).HasColumnName("Created_On");
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedByUserId).HasColumnName("Created_By");


        mb.Entity<Cricketer>().Map(a =>
        {
            a.Property(x => x.Id).HasColumnName("Id");
            a.Property(x => x.UserId).HasColumnName("User_Id");
            a.Property(x => x.Domain).HasColumnName("User_Dmain");
            a.Property(x => x.AuditDetails.CreatedByUserId).HasColumnName("CreatedByUserId");
            a.Property(x => x.AuditDetails.CreatedDate).HasColumnName("CreatedDate");
        })
        .HasKey(x => x.ID)
        .ToTable("Tbl_User");   //<==Again, dont ask
    }
}
公开课试听信息
{
public long CreatedByUserId{get;set;}
公共日期时间CreatedDate{get;set;}
}
公开摘要类AuditInfo
{
公开审核信息审核详细信息{get;set;}
公众资讯
{
this.AuditDetails=新的审核信息();
this.AuditDetails.CreatedByUserId=0;
this.AuditDetails.CreatedDate=DateTime.Now;
}
}
公众用户:AuditInfo
{
私有用户(){}
公共长Id{get;private set;}//不询问,继承的旧数据库
公共字符串用户标识{get;private set;}
公共字符串域{get;private set;}
//…域逻辑等
}
公共部分类myContext:DbContext
{
公共数据库集用户{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder mb)
{
mb.Conventions.Remove();
mb.ComplexType();
mb.ComplexType().Property(a=>a.CreatedDate).HasColumnName(“已创建”);
mb.ComplexType().Property(a=>a.CreatedByUserId).HasColumnName(“创建人”);
mb.Entity().Map(a=>
{
a、 属性(x=>x.Id);
a、 属性(x=>x.UserId);
a、 属性(x=>x.Domain);
a、 属性(x=>x.AuditDetails.CreatedByUserId).HasColumnName(“CreatedByUserId”);
a、 属性(x=>x.AuditDetails.CreatedDate).HasColumnName(“CreatedDate”);
})
.HasKey(x=>x.ID)

.ToTable(“Tbl_User”);//这就成功了。不需要实体映射区域中的HasColumnName()作为在complextype属性方法中定义的名称,我需要这些方法。
----> System.Data.Entity.Infrastructure.DbUpdateException : A value shared across entities or associations is generated in more than one location. Check that mapping does not split an EntityKey to multiple store-generated columns.
----> System.Data.Entity.Core.UpdateException : A value shared across entities or associations is generated in more than one location. Check that mapping does not split an EntityKey to multiple store-generated columns.
----> System.ArgumentException : An item with the same key has already been added.
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.
public class AuditInformation
{
    public long CreatedByUserId { get; set; }
    public DateTime CreatedDate { get; set; }
}

public abstract class AuditInfo
{
    public AuditInformation AuditDetails { get; set; }

    public AuditInfo()
    {
        this.AuditDetails = new AuditInformation();
        this.AuditDetails.CreatedByUserId = 0;
        this.AuditDetails.CreatedDate = DateTime.Now;
    }
}

public User : AuditInfo
{
    private User(){}
    public long Id {get; private set;} // dont ask, inherited legacy database
    public string UserId { get; private set; }
    public string Domain { get; private set; }

    //..domain logic etc
}

public partial class myContext : DbContext 
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        mb.Conventions.Remove<PluralizingTableNameConvention>();

        mb.ComplexType<Domain.Model.AuditInformation>();
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedDate).HasColumnName("Created_On");
        mb.ComplexType<Domain.Model.AuditInformation>().Property(a => a.CreatedByUserId).HasColumnName("Created_By");


        mb.Entity<Cricketer>().Map(a =>
        {
            a.Property(x => x.Id).HasColumnName("Id");
            a.Property(x => x.UserId).HasColumnName("User_Id");
            a.Property(x => x.Domain).HasColumnName("User_Dmain");
            a.Property(x => x.AuditDetails.CreatedByUserId).HasColumnName("CreatedByUserId");
            a.Property(x => x.AuditDetails.CreatedDate).HasColumnName("CreatedDate");
        })
        .HasKey(x => x.ID)
        .ToTable("Tbl_User");   //<==Again, dont ask
    }
}