是否有任何方法可以在Entity Framework中创建两个实体之间的关系,这在数据库中没有任何关系?

时间:2012-09-06 10:46:12

标签: c# entity-framework

以下是生成的模型:

public class DbObjectMap : EntityTypeConfiguration<DbObject>
{
    public DbObjectMap()
    {
        // Primary Key
        HasKey(t => new { t.Type, CompanyName = t.CompanyName, Id = t.Id });

        // Properties
        Property(t => t.Timestamp)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(8)
            .IsRowVersion();

        Property(t => t.Type)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        Property(t => t.CompanyName)
            .IsRequired()
            .HasMaxLength(30);

        this.Property(t => t.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(30);

        this.Property(t => t.VersionList)
            .IsRequired()
            .HasMaxLength(80);

        this.Property(t => t.LockedBy)
            .IsRequired()
            .HasMaxLength(132);

        // Table & Column Mappings
        this.ToTable("Object");
        this.Property(t => t.Timestamp).HasColumnName("timestamp");
        this.Property(t => t.Type).HasColumnName("Type");
        this.Property(t => t.CompanyName).HasColumnName("Company Name");
        this.Property(t => t.Id).HasColumnName("ID");
        this.Property(t => t.Name).HasColumnName("Name");
        this.Property(t => t.Modified).HasColumnName("Modified");
        this.Property(t => t.Compiled).HasColumnName("Compiled");
        this.Property(t => t.BlobReference).HasColumnName("BLOB Reference");
        this.Property(t => t.BlobSize).HasColumnName("BLOB Size");
        this.Property(t => t.DbmTableNo).HasColumnName("DBM Table No_");
        this.Property(t => t.Date).HasColumnName("Date");
        this.Property(t => t.Time).HasColumnName("Time");
        this.Property(t => t.VersionList).HasColumnName("Version List");
        this.Property(t => t.Locked).HasColumnName("Locked");
        this.Property(t => t.LockedBy).HasColumnName("Locked By");
    }
}

{
    public ObjectTrackingMap()
    {
        // Primary Key
        HasKey(t => new { ObjectType = t.ObjectType, Id = t.Id, ChangeType = t.ChangeType });

        // Properties
        Property(t => t.Timestamp)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(8)
            .IsRowVersion();

        Property(t => t.ObjectType)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        Property(t => t.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        Property(t => t.ChangeType)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);



        // Table & Column Mappings
        ToTable("Object Tracking");
        Property(t => t.Timestamp).HasColumnName("timestamp");
        Property(t => t.ObjectType).HasColumnName("Object Type");
        Property(t => t.Id).HasColumnName("Object ID");
        Property(t => t.ChangeType).HasColumnName("Change Type");
        Property(t => t.ObjectTimestamp).HasColumnName("Object Timestamp");
    }
}

这两个对象在数据库表中没有任何关系。但他们可以加入 Object.Type = ObjectTracking.ObjectTypeObject.ID = ObjectTracking.ObjectID字段。

有没有办法在EF中使用FluentAPI为这两个实体创建正确的映射?

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用Visual Studio - 只需在图形设计器模式下打开您的EDMX文件(双击它),激活工具箱和属性窗口(在顶部的视图菜单中),从工具箱中选择“关联”并拖动您的关系从一个表到另一个表,而不是在属性窗口中调整它。

答案 1 :(得分:0)

据我所知,Fluent API设置旨在反映数据库本身。因此,缺少字符串上的最小长度设置(可以使用注释属性)。因此,您通过流畅的API设置的请求没有反映在数据库中似乎包含致命的矛盾。

为了实现您的目标,我建议您自己进行“链接”,可能在访问这些表的存储库层,业务逻辑或位于任何数据访问层之上的其他层。使用

希望有所帮助:)